第一次總結,個人淺見,望大牛們輕削,怕疼,呵呵~~~
1.已知前序遍歷和中序遍歷序列,可以唯一確定一棵二叉樹。
2.已知後序遍歷和中序遍歷序列,可以唯一確定一棵二叉樹。
3.已知後續遍歷和前序遍歷序列,不能唯一確定一棵二叉樹。
綜上:要想唯一確定乙個二叉樹,必須要有中序遍歷序列。
遍歷規則:
1、先序或者前序遍歷規則:根左右
2、中序遍歷規則:左根右
3、後序遍歷規則:左右根
例子1:前序:abcdef,中序:cbaedf,後序=?
根據前序規則:根左右,根是第乙個被遍歷的,那麼這棵樹的根就是a,那麼就可以將中序遍歷分隔出來左子樹和右子樹了
左子樹:b、c 右子樹:d、e、f
如下:前序 a|bc|def
中序 cb|a|edf
左子樹:
左子樹前序遍歷順序為bc,首先遍歷左子樹的"根",則b為左子樹的根節點
中序遍歷順序為cb,遍歷順序為左根右,則可知c為b的左葉子節點
右子樹:
前序遍歷規則:根左右,右子樹的"根"為d,則e、f是d的子節點
中序遍歷規則:左根右,e是d的左葉子節點,f是d的右葉子節點
此時就把這棵樹的左子樹和右子樹確定了下來,如下:
a/ \
b d
/ / \
c e f
再根據後序遍歷規則:左右根,可知後序遍歷結果:cbefda
詳解:先從左子樹遍歷,先找到左葉子節點c,然後左右根規則,b節點沒有右葉子節點,遍歷"根",則此時為cb,左子樹遍歷完畢,根據左右根規則,整棵樹的根是最後遍歷的,先遍歷完左子樹,然後遍歷右子樹,最後遍歷整棵樹的根遍歷右子樹,根據左右根規則,找到左葉子節點e,然後遍歷f,再遍歷d,則此時右子樹遍歷為efd,右子樹遍歷完畢,最後遍歷整棵樹的根a。完整的後序遍歷順序就是:cbefda
小結:
(1)根據前(先)序判斷根節點,從中序分隔左子樹和右子樹
(2)然後根據先序,中序遍歷規則結合,分別處理左右子樹,將樹的節點順序確定下來
(3)最終確定整棵樹,畫出來,最後再根據後序遍歷規則進行遍歷即可。
例子2:中序:abcdefg,後序:bdcafge,前(先)序=?
根據後序遍歷規則:左右根,可知,根是最後遍歷的節點,那麼e就是整棵樹的根節點。然後根據中序遍歷規則:左根右,e又是根節點,那麼必定有左子樹(如果沒有左子樹a就是根節點),可知a一定在左子樹中,那麼可以將中序和後序結果分出左子樹和右子樹來
左子樹:a、b、c、d 右子樹:e、f、g
如下:中序:abcd|efg
後序:bdca|fge
右子樹:
右子樹節點少,先處理右子樹,已知e為樹的根節點,
中序遍歷規則為:左根右,有以下情況:
(1)f若是右子樹的左葉子節點,g則是右子樹根節點;
(2)f若是右子樹的根節點,g則是右子樹的右葉子節點
後序遍歷規則:左右根,根據中序遍歷情況(1),f右子樹的左葉子節點,g右子樹根節點的規則,可以得出fg的遍歷結果;
根據中序遍歷情況(2),那麼首先遍歷的節點應該是g,之後是f,和正確結果不符,那麼第一種情況就是我們想要的結果。
此時右子樹節點順序確定完畢,結果為:f是右子樹的左葉子節點,g是右子樹根節點
左子樹:
看左子樹後序遍歷結果:bdca,根據左右根規則可知,a是左子樹的根節點,那麼就是確定b、c、d在左子樹中的順序了
看左子樹中序遍歷結果abcd,a是左子樹根節點,並且a節點沒有左子節點(如果有,那麼中序遍歷就從a的左子節點開始,不符合題目中的中序遍歷結果),所以bcd組成了a節點的右子樹,此處定義a節點的右子樹為a子樹。
情況如下:
(1)b為a子樹的左葉子節點,則c為a子樹根節點,d為a子樹的右葉子節點
(2)b為a子樹的根節點,則c為a子樹的右子節點,d為c的右葉子節點
有點繞啊,不好意思~~~~這時候其實就應該在紙上畫出圖形了,直觀和容易比對出現的情況
後序遍歷結果:bdc(a已知為左子樹根節點,暫不考慮)
規則:左右根
根據中序遍歷情況(1),b為左葉子節點,d為右葉子節點,c為"根"節點,可以得出bdc的結果
根據中序遍歷情況(2),後序遍歷結果為:dcb, 和題目中正確後序遍歷結果不一致,那麼第一種情況就是我們要的結果,此時左子樹可以確定節點順序,結果:定義a節點的右子樹為a子樹。b為a子樹的左葉子節點,c為a子樹根節點,d為a子樹的右葉子節點
此時就把這棵樹的左子樹和右子樹確定了下來,如下:
e/ \
a g
\ /
c f
/ \b d
再根據先序遍歷順序:根左右,可知先序遍歷順序:eacbdgf
詳解:先從整棵樹的根開始遍歷,e,然後遍歷左子樹,左子樹根為a,左子樹沒有左子節點,開始遍歷右子節點,"根"為c,遍歷左子節點b,右子節點d,此時左子樹遍歷完畢,結果為eacbd遍歷右子樹,右子樹根節點為g,然後遍歷左子節點為f,此時右子樹遍歷完畢,結果:gf
整棵樹先序遍歷完畢,結果:eacbdgf
小結:(1)根據後序遍歷結果找出整棵樹的根節點
(2)根據中序遍歷的起始節點將後序遍歷和中序遍歷結果分隔成左子樹和右子樹
(3)先處理節點較少的子樹,再處理節點較多的子樹
(4)根據後序遍歷結果區分出來的子樹序列節點的最後乙個節點,確定為該子樹的根節點
(5)然後對剩下的節點根據中序遍歷順序假設各種情況,用後序遍歷規則對這些情況進行套用,找出符合後序遍歷結果的那種情況。
如果分隔出來的左右子樹節點多而複雜可以繼續套用(4)、(5),進行區分處理
以上是小弟的個人淺見,可能大家還有更多更好更簡便的方法,希望大家能夠互相交流討論。
推導二叉樹的遍歷結果
已知二叉樹的中序序列是abcdefg,後序序列是bdcafge,求前序序列。二叉樹的後序序列是按照 左子樹 右子樹 根 的順序排列的,序列中最後乙個元素代表該二叉樹的根節點。二叉樹的前序序列是按照 根 左子樹 右子樹 的順序排列的,序列中第乙個元素代表該二叉樹的根節點。故通過已知的後序序列可以發現根...
二叉樹推導
3 二叉樹的推導 3.1 由前序中序推導 已知一棵二叉樹的前序序列和中序序列,構造該二叉樹的過程如下 根據前序序列的第乙個元素建立根結點 在中序序列中找到該元素,確定根結點的左右子樹的中序序列 在前序序列中確定左右子樹的前序序列 由左子樹的前序序列和中序序列建立左子樹 由右子樹的前序序列和中序序列建...
二叉樹的遍歷總結
2 中序遍歷 3 後序遍歷 4 層次遍歷 給定乙個二叉樹,返回它的前序 遍歷。示例 輸入 1,null,2,3 輸出 1,2,3 definition for a binary tree node.public class treenode class solution private void h...