方法呢,與前一篇一樣,建樹或者不建樹皆可,這裡不做過多說明,直接show code。
way 1.
typedef struct treenode *bintree;
struct treenode
};
bintree buildtree(char *post, char *in, int n)
way 2.
const int maxn = 100;
char pre[maxn], in[maxn], post[maxn];
/*
call: topreseq(0, 0, 0, strlen(post));
*/void topreseq(int postindex, int inindex, int preindex, int n)
char root = post[postindex + n - 1];
int i;
pre[preindex] = root;
for(i = 0; i < n && in[inindex + i] != root; ++i)
;int lenleft = i, lenright = n - i - 1;
topreseq(postindex, inindex, preindex + 1, lenleft); //注意傳參
topreseq(postindex + lenleft, inindex + lenleft + 1, preindex + lenleft + 1, lenright);
}
note: 此演算法正確的前提是保證後序中序序列正確。
已知先序中序序列求後序序列
way 1.由先序和中序遍歷序列確定一棵二叉樹,再後序遍歷得到後序序列。如何確定呢?1.根據先序遍歷的第乙個結點確定根節點 2.根據根節點在中序遍歷序列的位置分割出左右兩個子串行,即根節點的左右子樹 3.對左右子樹按此方法遞迴進行分解。定義二叉樹的資料結構 typedef struct treeno...
已知後序中序,求先序
利用後序遍歷的最後乙個元素 根結點 在中序遍歷中找到它,分割為左子樹和右子樹,然後在後序遍歷中找到子樹的根結點 起點 終點,分別遞迴。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...