例:已知一棵二叉樹的先序序列與中序序列分別爲:
A B C D E F G H I
B C A E D G H F I
試構造該二叉樹。
分析:
根據定義,二叉樹的先序遍歷是先訪問根結點,其次再按先序遍歷方式遍歷根結點的左子樹,最後按先序遍歷方式遍歷根結點的右子樹。這就是說,在先序序列中,第一個結點一定是二叉樹的根結點。如下圖(a)所示。
另一方面,中序遍歷是先遍歷左子樹,然後訪問根結點,最後再遍歷右子樹。這樣,根結點在中序序列中必然將中序序列分割成兩個子序列,前一個子序列是根結點的左子樹的中序序列,而後一個子序列是根結點的右子樹的中序序列。如下圖(b)所示
根據這兩個子序列,在先序序列中根據中序序列對應的左子樹的先序序列和右子樹的先序序列。在先序序列中,左子序列的第一個結點是左子樹的根結點,右子序列的第一個結點是右子樹的根結點。這樣,就確定了二叉樹的三個結點。同時,左子樹和右子樹的根結點又可以分別把左子序列和右子序列劃分爲兩個子序列,如此遞歸下去,當取儘先序序列中的結點時,便可以得到一棵二叉樹。
具體到本題目,首先由先序序列可知,結點 A 是二叉樹的根結點。其次,根據中序序列,在 A 之前的所有結點都是根結點左子樹的結點,在 A 之後的所有結點都是根結點右子樹的結點,由此得到下圖(a)所示的狀態。然後再對左子樹進行分解,得知 B 是左子樹的根結點,又從中序序列知道,B 的左子樹爲空,B 的右子樹只有一個結點 C。接着對 A 的右子樹進行分解,得知 A 的右子樹的根結點爲 D;而結點 D 把其餘結點分成兩部分,即左子樹爲 E,右子樹爲 F、G、H、I,如下圖(b)所示。接下去的工作就是按上述原則對 D 的右子樹繼續分解下去,最後得到如下圖(c)所示的整棵二叉樹。