way 1. 由先序和中序遍歷序列確定一棵二叉樹,再後序遍歷得到後序序列。
如何確定呢?
1. 根據先序遍歷的第乙個結點確定根節點;
2. 根據根節點在中序遍歷序列的位置分割出左右兩個子串行,即根節點的左右子樹;
3. 對左右子樹按此方法遞迴進行分解。
定義二叉樹的資料結構:
typedef struct treenode *bintree;
struct treenode
};
由先序中序序列建立二叉樹:
bintree buildtree(char* pre, char* in, int n) //n是當前樹中的結點數
建立好之後,再後序遍歷之。
way 2. 不建立樹,直接由先序中序序列得到後序遍歷序列。
思路與上面建立樹的演算法一致,只不過由生成節點改為「填充」後序序列。
const int maxn = 100;
char pre[maxn], in[maxn], post[maxn];
/*
preindex: 先序序列起始位置
inindex: 中序序列起始位置
postindex:後序序列起始位置
call: topostseq(0, 0, 0, strlen(pre))
*/void topostseq(int preindex, int inindex, int postindex, int n)
int root = pre[preindex], i;
post[postindex + n - 1] = pre[preindex]; //後序序列中,最後乙個是根節點
for(i = 0; i < n && in[inindex + i] != root; ++i) //確定根節點在中序序列中的位置
;int lenleft = i, lenright = n - i - 1;
topostseq(preindex + 1, inindex, postindex, lenleft);
topostseq(preindex + lenleft + 1, inindex + lenleft + 1, postindex + lenleft, lenright);
}
已知後序中序序列求先序序列
方法呢,與前一篇一樣,建樹或者不建樹皆可,這裡不做過多說明,直接show code。way 1.typedef struct treenode bintree struct treenode bintree buildtree char post,char in,int n way 2.const ...
已知後序中序,求先序
利用後序遍歷的最後乙個元素 根結點 在中序遍歷中找到它,分割為左子樹和右子樹,然後在後序遍歷中找到子樹的根結點 起點 終點,分別遞迴。int leftrootpo rootpo end rootin 1 左子樹的根結點在後序遍歷中的位置。end rootin 右子樹的結點個數 int leftsta...
已知中序和後序求先序
include include using namespace std struct tnode define len sizeof tnode typedef tnode pbtnodepoint void vcreate string sinorder,string spostorder,pbt...