解答思路
相關題目
給出二叉樹的中序遍歷序列和層序遍歷序列,程式設計還原該二叉樹。
第1行:二叉樹的中序遍歷序列
第2行:二叉樹的層序遍歷序列
二叉樹的前序遍歷序列
abcdefg
dbafegc
abdcefg
#include
#include
#include
#include
using
namespace std;
struct btreenode
;void
lev_mid_restore
(string lev, string mid, btreenode *result)
/* 0 1 2 3 4 5 6 7
helper 0 0 a 0 0 0 0 0
left 0 0 0 0 0 0 0 0
right 0 0 0 0 0 0 0 0
*///此處用來構建根節點
result-
>data = lev[0]
; result-
>left ==
null
; result-
>right =
null
;//將根節點加入到上面的**中
int levindex = mid.
find
(lev[0]
);helper[levindex]
= result;
bool flag =
false
;for
(int i =
1; i < lev.
size()
; i++
)break
;//一旦碰到要立馬停止}}
if(flag)
/*從當前節點x的右邊還是找,如果找到乙個非0的節點y
判斷其左孩子是否為空,如果為空,則x是y的左孩子
如果y已經有左孩子了,則說明這個中序/層次遍歷序列有問題
*/for(
int p = levindex +
1; p < size; p++
)break;}
}//因為既然到了這一步,還沒有配對成功,就說明給的中序/層次遍歷序列有問題if(
!flag)}}
void
preordertree
(btreenode *node)
}int
main()
這裡我們假設
中序為:dbafegc
層序為:abcdefg
這裡我們使用乙個hlp陣列用來存放節點指標,其對應於中序遍歷字串
(1) 起始狀態
middba
fegc
0123
456hlp00
0000
0l00
0000
0r00
0000
0這裡的l/r代表了該節點是否有左右孩子,hlp存放的是節點指標
(2) [a]bcdefg
因為是層序遍歷,所以此時的a便是該序列的根節點,所以我們查詢a在mid中的位置,建立乙個節點到對應位置,這裡我們就找到了此時的根節點,初建立的節點沒有左右孩子。
middba
fegc
0123
456hlp00
a000
0l00
0000
0r00
0000
0(2) a[b]cdefg
此時我們拿到了b這個節點,因為同輩節點只能有乙個,所以b節點一定是a節點的子節點,此時我們找到b在mid中的位置,並先向左面找有沒有非0的指標,在這裡我們沒有找到。然後從b的右邊開始找有沒有非0的指標,找到了a。發現a沒有孩子節點,那麼令b為a的左孩子。
middba
fegc
0123
456hlp0b
a000
0l00
2b000
0r00
0000
0(3) ab[c]defg
同上找到c,發現c是a的右孩子
middba
fegc
0123
456hlp0b
a000
cl00
2b000
0r00
6c000
0(4) abc[d]efg
同上找到d,發現d是b的左孩子
middba
fegc
0123
456hlpdb
a000
cl00d
2b000
0r00
6c000
0(5) abcd[e]fg
這裡有些不同,因為e向左找發現a已經有了右孩子,所它必須向
右找,結果發現e是c的左孩子。
middba
fegc
0123
456hlpdb
a0e0
cl00d
2b000
4er00
6c000
0(6) abcde[f]g
同上,f做不了a的右孩子,只能做了e的左孩子
middba
fegc
0123
456hlpdb
afe0
cl00d
2b03f0
4er00
6c000
0(7) abcdef[g]
g向左找,發現g可以做e的右孩子
middba
fegc
0123
456hlpdb
afeg
cl00d
2b03f0
4er00
6c05g0
0到此為止abcdefg的關係都已經建立好了,二叉樹還原完成。
此時也可以根據類似於靜態陣列儲存方式來構建二叉樹:靜態陣列儲存構建二叉樹,或者根據本題目中給出的解答方式也可。
至於為什麼我們一定要先從左開始找,然後再向右找,也許是因為二叉樹的中序遍歷它本身就是從左到右的吧。
二叉樹先序,中序,後序,層序遍歷還原
已知中序遍歷和層序遍歷還原二叉樹
在網上找了很久發現能寫清楚的很少。命名風格讓人真的很難理解。參考了大神的 原位址大神 已知層序和中序還原二叉樹 vector int layer 層序遍歷結果 vector int leftlayer vector int rightlayer in il,ir 中序遍歷結果 node creat ...
已知中序遍歷和先序遍歷重建二叉樹
main.cpp constructbinarytree created by bazinga on 2017 3 12.根據前序遍歷和中序遍歷求二叉樹的結構 已知前序遍歷的第乙個值為根節點 而根節點在中序遍歷中的位置就能確定他的左右子樹。然後對區分開的左右子樹進行遞迴。include includ...
二叉樹遍歷(已知中序和按層遍歷求先序 遞迴)
時間限制 1000 ms 記憶體限制 65536 kb 提交數 8 通過數 6 樹和二叉樹基本上都有先序 中序 後序 按層遍歷等遍歷順序,給定中序和其它一種遍歷的序列就可以確定一棵二叉樹的結構。假定一棵二叉樹乙個結點用乙個字元描述,現在給出中序和按層遍歷的字串,求該樹的先序遍歷字串。兩行,每行是由字...