1. 程式人生 > >先序遍歷和後序遍歷為什麼不能唯一地確定一棵樹?

先序遍歷和後序遍歷為什麼不能唯一地確定一棵樹?

以前大學學資料結果的時候,我們就知道,根據一棵樹的先序遍歷和中序遍歷,或者後序遍歷和中序遍歷序列,都可以唯一地確定一棵樹。

樹中的節點,分為度為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, 此時就不能唯一確定了。