已知先序中序序列求後序序列

2021-07-09 14:17:09 字數 1261 閱讀 8295

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...