十八、二叉树遍历序列还原
生活随笔
收集整理的這篇文章主要介紹了
十八、二叉树遍历序列还原
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
十八、二叉樹遍歷序列還原
文章目錄
- 十八、二叉樹遍歷序列還原
- 題目描述
- 解題思路
- 上機代碼
題目描述
給出二叉樹的中序遍歷序列和后序遍歷序列,編程還原該二叉樹。
輸入:
?第1行為二叉樹的中序遍歷序列
第2行為二叉樹的后序遍歷序列
輸出:
二叉樹的按層遍歷序列
| 測試用例 1 | badcfeg bdfgeca | abcdefg | 1秒 | 64M | 0 |
| 測試用例 2 | cbdafeg cbdfgea | adebfgc | 1秒 | 64M | 0 |
| 測試用例 3 | edcba edcba | abcde | 1秒 | 64M | 0 |
| 測試用例 4 | bdfgeca gfedcba | abcdefg | 1秒 | 64M | 0 |
解題思路
由后序序列的遍歷方式可知,后序序列的最后一個結點一定是二叉樹的根結點。通過找到根結點在中序序列中的位置,可以將中序序列分成左右兩個序列,左側序列是根結點的左子樹的中序序列,右側序列是根結點右子樹的中序序列。
對于根結點左子樹的遍歷來說,不管是中序遍歷還是后序遍歷,因為結點數的相同的,遍歷結果的長度也一定相同。可以根據根結點左子樹的中序遍歷序列的長度,得到后序序列中根結點左子樹的后序序列。對根結點的右子樹同理,可以得到后序序列中根結點右子樹的后序序列。
這樣,根結點左右子樹的中序和后序遍歷序列都一一對應了起來,采用遞歸的方式即可將整個二叉樹的關系搞清楚,并建立起二叉樹。
對測試用例 2 進行說明
后序序列 cbdfgea 可以知道根結點為 a,從而將中序序列分為 cbd、feg,即根結點的左右子樹的中序遍歷序列。根節點的左子樹的長度為3,可以得到后序序列中的 cbd 為根結點左子樹的后序序列。同理 fge是根結點右子樹的后序序列。
將中序序列 cbd 和后序序列 cbd 結合,中序序列 feg 和后序序列 fge 結合,可以分別求出根結點的左右子樹的根結點,這樣遞歸求解下來,就可以得到整個二叉樹的關系了。
上機代碼
#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;//找到根結點在序列中的位置 int find(char index, char *array, int len)//待查找的根結點,查找序列,序列長度 {for (int i = 0; i < len; i++){if (array[i] == index)return i;} } //遞歸建立二叉樹 BiTree BuildBiTree(char *center, char *last, int len)//中序序列、后序序列、序列長度 {if (len <= 0)return NULL;BiTree T = new BiTNode;T->data = last[len - 1];//后序序列的最后結點一定是根結點int root = find(last[len - 1], center, len);//找到根結點在中序序列中的位置//根據拆分的序列遞歸建樹T->lchild = BuildBiTree(center, last, root);T->rchild = BuildBiTree(center + root + 1, last + root, len - root - 1);return T; } void bfs(BiTree T) //利用隊列進行層次遍歷 {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));//根據輸入序列建樹cin >> inorder >> postorder;len = strlen(postorder);bit = BuildBiTree(inorder, postorder, len);//輸出層次序列bfs(bit);return 0; }總結
以上是生活随笔為你收集整理的十八、二叉树遍历序列还原的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 十七、二叉树的建立与基本操作
- 下一篇: 十九、二叉树的最近的公共祖先