十八、二叉树遍历序列还原
十八、二叉樹(shù)遍歷序列還原
文章目錄
- 十八、二叉樹(shù)遍歷序列還原
- 題目描述
- 解題思路
- 上機(jī)代碼
題目描述
給出二叉樹(shù)的中序遍歷序列和后序遍歷序列,編程還原該二叉樹(shù)。
輸入:
?第1行為二叉樹(shù)的中序遍歷序列
第2行為二叉樹(shù)的后序遍歷序列
輸出:
二叉樹(shù)的按層遍歷序列
| 測(cè)試用例 1 | badcfeg bdfgeca | abcdefg | 1秒 | 64M | 0 |
| 測(cè)試用例 2 | cbdafeg cbdfgea | adebfgc | 1秒 | 64M | 0 |
| 測(cè)試用例 3 | edcba edcba | abcde | 1秒 | 64M | 0 |
| 測(cè)試用例 4 | bdfgeca gfedcba | abcdefg | 1秒 | 64M | 0 |
解題思路
由后序序列的遍歷方式可知,后序序列的最后一個(gè)結(jié)點(diǎn)一定是二叉樹(shù)的根結(jié)點(diǎn)。通過(guò)找到根結(jié)點(diǎn)在中序序列中的位置,可以將中序序列分成左右兩個(gè)序列,左側(cè)序列是根結(jié)點(diǎn)的左子樹(shù)的中序序列,右側(cè)序列是根結(jié)點(diǎn)右子樹(shù)的中序序列。
對(duì)于根結(jié)點(diǎn)左子樹(shù)的遍歷來(lái)說(shuō),不管是中序遍歷還是后序遍歷,因?yàn)榻Y(jié)點(diǎn)數(shù)的相同的,遍歷結(jié)果的長(zhǎng)度也一定相同。可以根據(jù)根結(jié)點(diǎn)左子樹(shù)的中序遍歷序列的長(zhǎng)度,得到后序序列中根結(jié)點(diǎn)左子樹(shù)的后序序列。對(duì)根結(jié)點(diǎn)的右子樹(shù)同理,可以得到后序序列中根結(jié)點(diǎn)右子樹(shù)的后序序列。
這樣,根結(jié)點(diǎn)左右子樹(shù)的中序和后序遍歷序列都一一對(duì)應(yīng)了起來(lái),采用遞歸的方式即可將整個(gè)二叉樹(shù)的關(guān)系搞清楚,并建立起二叉樹(shù)。
對(duì)測(cè)試用例 2 進(jìn)行說(shuō)明
后序序列 cbdfgea 可以知道根結(jié)點(diǎn)為 a,從而將中序序列分為 cbd、feg,即根結(jié)點(diǎn)的左右子樹(shù)的中序遍歷序列。根節(jié)點(diǎn)的左子樹(shù)的長(zhǎng)度為3,可以得到后序序列中的 cbd 為根結(jié)點(diǎn)左子樹(shù)的后序序列。同理 fge是根結(jié)點(diǎn)右子樹(shù)的后序序列。
將中序序列 cbd 和后序序列 cbd 結(jié)合,中序序列 feg 和后序序列 fge 結(jié)合,可以分別求出根結(jié)點(diǎn)的左右子樹(shù)的根結(jié)點(diǎn),這樣遞歸求解下來(lái),就可以得到整個(gè)二叉樹(shù)的關(guān)系了。
上機(jī)代碼
#include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<queue> #include<vector> #include<algorithm> using namespace std; typedef struct BiTNode {char data;struct BiTNode *lchild;struct BiTNode *rchild; }BiTNode,*BiTree;//找到根結(jié)點(diǎn)在序列中的位置 int find(char index, char *array, int len)//待查找的根結(jié)點(diǎn),查找序列,序列長(zhǎng)度 {for (int i = 0; i < len; i++){if (array[i] == index)return i;} } //遞歸建立二叉樹(shù) BiTree BuildBiTree(char *center, char *last, int len)//中序序列、后序序列、序列長(zhǎng)度 {if (len <= 0)return NULL;BiTree T = new BiTNode;T->data = last[len - 1];//后序序列的最后結(jié)點(diǎn)一定是根結(jié)點(diǎn)int root = find(last[len - 1], center, len);//找到根結(jié)點(diǎn)在中序序列中的位置//根據(jù)拆分的序列遞歸建樹(shù)T->lchild = BuildBiTree(center, last, root);T->rchild = BuildBiTree(center + root + 1, last + root, len - root - 1);return T; } void bfs(BiTree T) //利用隊(duì)列進(jìn)行層次遍歷 {BiTree tmp = (BiTree)malloc(sizeof(BiTNode));queue<BiTree>q;q.push(T);while (!q.empty()){tmp = q.front();cout << tmp->data;q.pop();if (tmp->lchild != NULL)q.push(tmp->lchild);if (tmp->rchild != NULL)q.push(tmp->rchild);}cout << endl; } int main() {char *inorder = new char[105]; //中序序列char *postorder = new char[105]; //后序序列int len = 0;BiTree bit = (BiTree)malloc(sizeof(BiTNode));//根據(jù)輸入序列建樹(shù)cin >> inorder >> postorder;len = strlen(postorder);bit = BuildBiTree(inorder, postorder, len);//輸出層次序列bfs(bit);return 0; }總結(jié)
以上是生活随笔為你收集整理的十八、二叉树遍历序列还原的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 十七、二叉树的建立与基本操作
- 下一篇: 十九、二叉树的最近的公共祖先