能否通過兩種遍歷序列畫出一棵樹?


樹有通常三種遍歷方法:前序遍歷,中序遍歷,后序遍歷,還有一種層序遍歷。如果只單單知道其中一種遍歷方法,是無法確定一顆樹的,但是如果有兩種遍歷方法能否確定一顆樹呢?這里不是二叉樹,只是簡單的樹,也就是當只有一個兒子的時候不嚴格區分是左兒子還是右兒子,統一當作是第一個兒子。

對於二叉樹來說,如果確定了中序遍歷或者層序遍歷以后,給出任意一種其他的遍歷序列,都可以得到唯一的一棵二叉樹。在只給出前序遍歷和后序遍歷的時候,無法確定唯一二叉樹。


前序遍歷和中序遍歷

首先,先明白,前序遍歷是先訪問樹根在分別前序遍歷子樹,也就是第一個訪問到的一定是當前樹或者子樹的樹根。中序遍歷是先中序遍歷第一個子樹,然后訪問樹根,在分別中序遍歷剩余的子樹。

所以可以以根作為突破口一層一層的把子樹分划出來。

舉個栗子:
前序遍歷:A B E F I J C D G H
中序遍歷:E B I F J A C G D H

首先我們可以確定A是這顆樹的根,通過查找中序列表可以知道EBIFJ為第一顆子樹,CGDH為另一邊的子樹,當然我們不知道有幾顆子樹。

所以初步的圖就是這樣的:

然后我們再用相同的手法划分一下EBIFJ這顆子樹,它的前序列表是BEFIJ,可以知道B是根結點,E為第一個葉子,IFJ為另一邊的子樹,我們再對比一下IFJ的前序列表為FIJ,F為根,左右葉子為I和J,沒有沖突。

現在我們的圖就是這個樣子的了:

然后再來看另外一邊是CGDH,前序列表為CDGH,按照之前的思考,C為根,GDH為另一邊的子樹,可是,不可能出現沒有第一顆子樹的情況,作為樹,應該寫成GDHC才符合。所以,可以認為C是一個獨立的葉子。GDH為另一棵子樹。按照之前的思路,D為根,G為左,H為右。沒有沖突。

最終圖就是:

然后我們現在順便寫出它的后序遍歷:E I J F B C G H D A。

當然畫成嚴格區分左右子樹的二叉樹也是可以的:


后序遍歷和中序遍歷

這個和前序遍歷和中序遍歷的方法類似,只不過后續遍歷的根是在最后,找到根,在中序列表中找到子樹的划分方式,按照相似的方法可以畫出一顆樹。
中序遍歷:E B I F J A C G D H
后序遍歷:E I J F B C G H D A
但是很可惜,畫出來的樹是這樣的:ps:這里c作為二叉樹的話是左兒子。

我們發現這兩棵樹的后序遍歷和中序遍歷序列是一樣的,由此我們可以可以簡單的看出,利用中序遍歷和后序遍歷可以確定一顆唯一的二叉樹,但是無法確定唯一的一顆樹。


前序遍歷和后序遍歷

結論先寫在前面,依靠前序遍歷和后序遍歷也是無法確定一顆樹的。所以我們嘗試着畫出一棵符合要求的樹:

前序遍歷:A B E F I J C D G H
后序遍歷:E I J F B C G H D A

我們順序遍歷一下前序列表,先確定A是根,在后序遍歷中A左邊的序列都是它的子樹,當然這堆子樹長啥樣我們不知道。然后觀察到B,我們知道B是A的一個兒子,先畫上去,然后在后序列表中觀察B左邊的序列是EIJF,這就是B的子樹。然后在前序列表中跳過EFIJ,觀察到C,所以C也是A的兒子,然后觀察后序列表中C的左邊沒有序列了(B到C之間沒有其他結點),所以C就是一個孤單的葉子。繼續觀察到D,D是A的第三個兒子,然后觀察后序列表中D左邊的序列發現GH是它的子樹,然后前序列表跳過GH,結束第一次遍歷。

然后利用相同的思路划分一下EIJF和GH就可以了,易得E是單獨的B的兒子,F是IJ的父親,GH分別為D的兒子。

最終樹為:


二叉樹層序遍歷特性

這里做個小的補充,針對於二叉樹來說,層序遍歷很好的給出了二叉樹每一層從左至右的結點,例如對於ABICGFJDEHK這個層序列表,A是第一層也就是根,BI是第二層,CGFJ是第三層,DEHK就是最后一層了。然后搭配前序,中序,后序列表就能畫出一棵唯一二叉樹。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM