已知中序遍歷和層序遍歷還原二叉樹

2021-10-10 06:51:34 字數 3244 閱讀 1092

解答思路

相關題目

給出二叉樹的中序遍歷序列和層序遍歷序列,程式設計還原該二叉樹。

第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 樹和二叉樹基本上都有先序 中序 後序 按層遍歷等遍歷順序,給定中序和其它一種遍歷的序列就可以確定一棵二叉樹的結構。假定一棵二叉樹乙個結點用乙個字元描述,現在給出中序和按層遍歷的字串,求該樹的先序遍歷字串。兩行,每行是由字...