二叉樹重建

2021-10-02 09:51:54 字數 2571 閱讀 4579

一棵二叉樹:

樹的先序遍歷序列preorder:dbacegf(根左右)

樹的中序遍歷序列inorder:abcdefg(左根右)

樹的後序遍歷序列postorder:acbfged(左右根)

樹的層序遍歷序列levelorder:dbeacgf(按行遍歷)

輸入一棵二叉樹的先序遍歷和中序遍歷序列,輸出它的後序遍歷序列。

輸入:dbacegf abcdefg  輸出:acbfged 

思路:

已知先序遍歷序列的第乙個一定是本樹的根節點,而後在中序遍歷中找到該根節點的位置,中序遍歷序列中根節點左邊為左子樹,右邊為右子樹,然後開始先左子樹後右子樹進行遞迴,因為要求的後序遍歷序列是左右根,故在遞迴完左右子樹後再輸出根。

code:

1 #include2

#define io ios::sync_with_stdio(false)

3using

namespace

std;

4string preorder,inorder,aa;//

分別為先序、中序、後序

5int

n,t;

6void recover(int l,intr)7

15int

main()

1626 cout<

28return0;

29 }

view code

輸入一棵二叉樹的中序遍歷和後序遍歷序列,輸出它的先序遍歷序列。

輸入:abcdefg acbfged 輸出:dbacegf

思路:

已知後序遍歷的最後乙個一定是本樹的根節點,所以先從後序中找到當前樹的根並輸出(因為所要求的先序遍歷是根左右,故找到根後就輸出),然後去中序裡找該根的位置,將中序劃為兩棵子樹(中序遍歷中根節點左邊為其左子樹,右邊為其右子樹),之後開始進行遞迴。

code:

1 #include2

using

namespace

std;

3string

preorder,inorder,postorder;

4void recover(int l,intr)5

15int

main()

1623

return0;

24 }

view code

1 #include2

using

namespace

std;

3void recover(string zhong,string

hou)11}

12int

main()

1320

return0;

21 }

view code

知道中序和後序遍歷,畫二叉樹和寫出前序遍歷輸入一顆二叉樹的先序遍歷和中序遍歷序列,輸出它的層序遍歷序列。輸入:dbacegf abcdefg   輸出:dbeacgf層序遍歷思路:
建立乙個佇列,先將根節點入隊,輸出根節點,將根節點的兒子先左後右入隊,根節點出隊,如此迴圈直到隊列為空。
code:

1 #include2

using

namespace

std;

3struct

treenode4;

8 treenode *create(char *pre,char *mid,int len) //

三個引數分別為先序序列,中序序列,序列長度

920 root->l=create(pre+1,mid,i); //

遞迴左子樹,左子樹中先序遍歷字串向後挪一位,中序不變,但i控制了長度

21 root->r=create(pre+i+1,mid+i+1,len-i-1);//

遞迴右子樹,右子樹中先序遍歷和中序遍歷都向後挪i+1位,長度變成總長度減去前半部分的長度

22return

root;23}

24void levelorder(treenode *root) //

層序遍歷

2531

while

(que.size())

3239

if(root->r)43}

44}45void postorder(treenode *root) //

後序遍歷

4653

54int

main()

5565

return0;

66 }

view code

二叉樹的前中後和層序遍歷詳細**(遞迴和非遞迴寫法)

二叉樹的遍歷(前、中、後序及層次遍歷,遞迴和非遞迴實現)

二叉樹 重建二叉樹

問題 給定二叉樹的前序遍歷結果和中序遍歷結果,恢復出原二叉樹。假設二叉樹中的元素都不重複,給定二叉樹的前序遍歷序列,二叉樹的中序遍歷序列。看到此題,我首先想到的是尋找根節點,由前序遍歷序列可以看出根節點為1,此時通過中序遍歷可以看出來4,7,2在根節點的左子樹,5,3,8,6在樹的右節點。此時我們可...

二叉樹 重建二叉樹

題目給定兩個陣列,乙個是前序遍歷陣列 preorder 乙個是中序遍歷陣列 inorder 要求輸出還原二叉樹 核心在於我們要理解前序和中序便利的特點 前序遍歷 根節點 左節點 右節點 中序遍歷 左節點 根節點 右節點 所以我們從二叉樹的根節點開始重構 也就是preorder的第乙個值 同時用乙個m...

二叉樹重建

摘自劉汝佳的 演算法競賽入門經典 preorder t t 的根結點 preorder t 的左子樹 preorder t 的右子樹 inorder t inorder t 的左子樹 t 的根結點 inorder t 的右子樹 postorder t postorder t 的左子樹 postord...