二叉樹 先序 中序 後序

2022-05-06 08:18:13 字數 1727 閱讀 9690

同學整理的,順便傳上分享下

一,已知先序和中序 求後序

1 #include2 #include3 #include4

using

namespace

std;

5char s1[10],s2[10],ans[10];6

int o = 0;7

void tree(int n , char * s1 , char * s2 , char*s)815

intmain()

1624

return0;

25 }

二、已知中序和後序遍歷,求前序遍歷

給出中序和後序遍歷:

中序遍歷:       adefghmz

後序遍歷:       aefdhzmg

畫樹求法:

第一步,根據後序遍歷的特點,我們知道後序遍歷最後乙個結點即為根結點,即根結點為g。

第二步,觀察中序遍歷adefghmz。其中root節點g左側的adef必然是root的左子樹,g右側的hmz必然是root的右子樹。

第三步,觀察中序遍歷左子樹adef,後序對應的是aefd,回到第一步,根據後續遍歷特點,根節點為d。

第四步,同樣的道理,root的右子樹節點hmz中的根節點也可以通過前序遍歷求得。在前後序遍歷中,一定是先把root和root的所有左子樹節點遍歷完之後才會遍歷右子樹,並且遍歷的左子樹的第乙個節點就是左子樹的根節點。同理,遍歷的右子樹的第乙個節點就是右子樹的根節點。

第五步,觀察發現,上面的過程是遞迴的。先找到當前樹的根節點,然後劃分為左子樹,右子樹,然後進入左子樹重複上面的過程,然後進入右子樹重複上面的過程。最後就可以還原一棵樹了。該步遞迴的過程可以簡潔表達如下:

1 確定根,確定左子樹,確定右子樹。

2 在左子樹中遞迴。

3 在右子樹中遞迴。

4 列印當前根。

那麼,前序遍歷:         gdafemhz

樣例輸入

badc

bdca

樣例輸出

abcd

1 #include2 #include3 #include4

using

namespace

std;

5char s1[10],s2[10],ans[10];6

int o = 0;7

void tree(int n , char * s1 , char * s2 , char*s)815

intmain()

1624

return0;

25 }

中  bdace

後  dbeca

1.由後序遍歷的知道最後乙個節點一定是根節點,該例中為a

2.中序中對應的根就是a,推得a為根bd為左子樹ce為右子樹

3.左子樹2個結點右子樹也為2個,因為後序遍歷是先左再右因此將後序分為兩段左db,右ec

4.由此確定左子樹的根為b,右子樹根為c:可以由後序遍歷最後乙個結點為根節點 確定。

5.在回到中序中  左子樹部分 bd (b為根)其右子樹為d    ;

右子樹部分 ce (根為c)其右子樹為e

如果結點和多的時候判斷都是這樣遞迴地進行.

由上述推得的結果

得到二叉樹的結構圖

-----a

----/--\

---b---c

----\-----\

-----d----e

得前序為 abdce

中序後序,中序先序求二叉樹

用後序,中序求二叉樹 includeusing namespace std int n int a 105 b 105 mapl,r int build int la,int ra,int lb,int rb 再在中序中找到這個數的位置 if i rb return root queueq void...

構造二叉樹 先序 中序 後序 中序

牛客網 給出一棵樹的前序遍歷和中序遍歷,請構造這顆二叉樹 注意 可以假設樹中不存在重複的節點 先遍歷的第乙個數是根節點,中序遍歷的根節點左邊是左子樹,右邊是右子樹。通過先序遍歷遍歷找到根結點,通過中序中根結點的位置可以將樹劃分成兩個子樹,然後遞迴的進行呼叫即可構造好二叉樹。definition fo...

二叉樹先序 中序 後序遍歷

題目 用遞迴和非遞迴方式,分別按照二叉樹先序 中序和後序列印所有的節點。我們約定 先序遍歷順序為根 左 右 中序遍歷順序為左 根 右 後序遍歷順序為左 右 根。遞迴實現 遞迴遍歷二叉樹 先序 public void preorderrecur node head system.out.println...