日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

十八、二叉树遍历序列还原

發(fā)布時(shí)間:2025/3/21 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 十八、二叉树遍历序列还原 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

十八、二叉樹(shù)遍歷序列還原

文章目錄

  • 十八、二叉樹(shù)遍歷序列還原
    • 題目描述
    • 解題思路
    • 上機(jī)代碼

題目描述

給出二叉樹(shù)的中序遍歷序列和后序遍歷序列,編程還原該二叉樹(shù)。

輸入:

?第1行為二叉樹(shù)的中序遍歷序列
第2行為二叉樹(shù)的后序遍歷序列

輸出:

二叉樹(shù)的按層遍歷序列

測(cè)試輸入期待的輸出時(shí)間限制內(nèi)存限制額外進(jìn)程
測(cè)試用例 1badcfeg
bdfgeca
abcdefg1秒64M0
測(cè)試用例 2cbdafeg
cbdfgea
adebfgc1秒64M0
測(cè)試用例 3edcba
edcba
abcde1秒64M0
測(cè)試用例 4bdfgeca
gfedcba
abcdefg1秒64M0

解題思路

由后序序列的遍歷方式可知,后序序列的最后一個(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。