先序遍歷和後序遍歷為什麼不能唯一地確定一棵樹?
以前大學學資料結果的時候,我們就知道,根據一棵樹的先序遍歷和中序遍歷,或者後序遍歷和中序遍歷序列,都可以唯一地確定一棵樹。
樹中的節點,分為度為0,1,2的結點。如果樹中只有一個節點,那麼可以唯一確定一棵樹,即只有一個節點的樹。
當樹中結點個數大於等於2的情況,樹中的葉子結點和它的父親結點中,至少有一種存在如下的情況。(為方便起見,我們先從葉子節點入手)
case 1: case2: case 3:
A D F
/ \ / \
B C E G
即,葉子結點的父親有兩個孩子,只有左孩子,只有右孩子的情況。我們只需要證明,如果樹存在這三種結構中的哪一種,可以唯一確定一棵樹,什麼情況下又不能唯一確定一棵樹呢?
1. case 1:
A
/ \
B C
前序遍歷: ABC, 後序遍歷: BCA
現在,我們根據遍歷序列,看看能否得到另一種樹的結構?
由於在前序遍歷中A第一個出現,則A為這棵樹的根節點。(前: A BC 後: BC A)
接下來,我們看,BC可以只在A的左子樹或者右子樹中出現嗎?
如果BC只出現在樹的左子樹或者右子樹中,則根據前序遍歷, B應為子樹的樹,C為B的孩子。則後序遍歷時,C應在B的前面。但實際的後序遍歷,C在B的後面。因此,BC不可能只出現在A的左子樹或者右子樹當中。因此,在這種情況下,可以唯一確定樹的結構。
2. case 2:
D
/
E
前序遍歷: DE, 後序遍歷: ED
則下面樹的結構也滿足前序和後序遍歷的序列。
D
\
E
即這種情況,不能唯一確定一棵樹。
3. case 3:
同case 2情況相似,也不能唯一確定一棵樹。
我們可以把葉子結點推廣成一棵樹的情況,即如果樹中只存在度為0和度為2的節點,則根據它的前序遍歷和後序遍歷序列,可以重構樹的結構。否則不能唯一重構樹。那如果給你一個前序和後序遍歷的序列,我們如何來判斷,它是否可以唯一地構造一棵樹呢?
即我們根據遍歷序列,來看看樹中,如果所有結點的度為0或者2,則可以唯一還原。
例: 前序: ABDFGEC 後序: FGDEBCA
第一步: 根結點為A
第二步: 根據前後序序列,B為A的左子樹的根,根據後序序列 將整個序列分為兩部分: FGDEB, C 即A有兩個孩子。
第三步: 繼續看以B為樹的樹,前序為 BDFGE, 後序: FGDEB 。 按照分析A的方法來分析 B,最後得知,這棵樹可以唯一確定。
但是如果把上面序列中的結點C給去掉,即:前序: ABDFGE 後序: FGDEBA, 此時就不能唯一確定了。