本節要討論的是當給定 n(n>=0)個結點時,可以構建多少種形態不同的樹。
每一棵普通樹對應的都是一棵沒有右子樹的二叉樹,所以對於 n 個結點的樹來說,樹的形態改變是因為除了根結點之外的其它結點改變形態得到的,所以,n 個結點構建的形態不同的樹與之對應的是 n-1 個結點構建的形態不同的二叉樹。
如果 t n 表示 n 個結點構建的形態不同的樹的數量,b n 表示 n 個結點構建的形態不同的二叉樹的數量,則兩者之間有這樣的關系:
圖 1 不同形態的二叉樹
對於具有 n( n>1 )個結點的二叉樹來說,都可以看成是一個根結點、由 i 個結點組成的左子樹和由
通過對公式一步步的數學推算,最后得出,含有 n 個結點的不相似的二叉樹的數量為:
例如,給定了一個二叉樹的前序序列和中序序列分別為:
圖 2 構造二叉樹的過程示意圖
分析:通過前序序列得知,結點A為二叉樹的根結點,結合中序序列,在結點 A 左側的肯定為其左孩子中的所有結點,右邊為右孩子的所有結點,如圖 2(1)所示。
再分析 A 結點的左孩子,在前序序列看到,結點 A 后緊跟的是結點 B,由此斷定結點 A 的左孩子是 B,再看中序序列,結點 B 左側只有一個結點 C ,為 B 的左孩子,結點 B 右側的結點E 和 D 為右孩子,如圖 2(2)。
再分析結點 B 的右孩子,前序序列看到,結點 D 在 E 的前邊,所有 D 為 B 的右孩子。在中序序列中,結點 E 在 D 前邊,說明 E 是 D 的左孩子,如圖 2(3)。
最后分析結點 A 的右孩子,由前序序列看到, F 在 G 前邊,說明F為根結點。在中序序列中也是如此,說明,G 是 F 的右孩子。如圖 2(4)所示。
如果要唯一確定一棵二叉樹,必須知道至少兩種遍歷序列。如果只確定一種序列,無法准確判定二叉樹的具體構造。
圖 3 前序序列(1,2,3)的二叉樹
如圖 3 所示為前序序列(1,2,3)構建的不同形態的二叉樹,他們的中序序列各不相同。所以不同形態二叉樹的數目恰好就是前序序列一定的情況下,所能得到的不同的中序序列的個數。
中序序列是對二叉樹進行中序遍歷獲得的,遍歷的過程實質上就是結點數據進棧出棧的過程。所以,中序序列的個數就是數列(1,2,3)按1-2-3的順序進棧,
各元素選擇在不同的時間點出棧,所獲的的不同的出棧順序即為中序序列,而中序序列的數目,也就是不同形態的二叉樹的個數。
圖 4 中序遍歷時進棧和出棧的過程
根據數列中數據的個數 n,所得到的排列順序的數目為:
通過以上兩種方式,都可以知道n個結點能構建的不同形態的二叉樹的數量,再結合 tn=bn-1,就可以計算出 n 個結點能構建的不同形態的樹的個數。
前面介紹過,對於任意一棵普通樹,通過孩子兄弟表示法的轉化,都可以找到唯一的一棵二叉樹與之對應。所以本節研究的題目也可以轉化成:n 個結點可以構建多少種形態不同的二叉樹。如果兩棵樹中各個結點的位置都一一對應,可以說這兩棵樹相似。如果兩棵樹不僅相似,而且對應結點上的數據也相同,就可以說這兩棵樹等價。本節中,形態不同的樹指的是互不相似的樹。
每一棵普通樹對應的都是一棵沒有右子樹的二叉樹,所以對於 n 個結點的樹來說,樹的形態改變是因為除了根結點之外的其它結點改變形態得到的,所以,n 個結點構建的形態不同的樹與之對應的是 n-1 個結點構建的形態不同的二叉樹。
如果 t n 表示 n 個結點構建的形態不同的樹的數量,b n 表示 n 個結點構建的形態不同的二叉樹的數量,則兩者之間有這樣的關系:
tn=bn-1
。
方法一
最直接的一種方法就是推理。當 n=0 時,只能構建一棵空樹;當 n=2 時,可以構建 2 棵形態不同的二叉樹,如圖 1(A);當 n=3 時,可以構建 5 棵形態互不相同的二叉樹,如圖 1(B)。
圖 1 不同形態的二叉樹
對於具有 n( n>1 )個結點的二叉樹來說,都可以看成是一個根結點、由 i 個結點組成的左子樹和由
n-i-1
個結點組成的右子樹。
可以得出一個遞推公式:當 n=1 時,也適用,只不過只有一個根結點,沒有左右孩子(i=0)。

通過對公式一步步的數學推算,最后得出,含有 n 個結點的不相似的二叉樹的數量為:

方法二
從遍歷二叉樹的角度進行分析,對於任意一棵二叉樹來說,它的前序序列和中序序列以及后序序列都是唯一的。其實是這句話還可以倒過來說,只要確定了一棵二叉樹的三種遍歷序列中的兩種,那么這棵二叉樹也可以唯一確定。例如,給定了一個二叉樹的前序序列和中序序列分別為:
前序序列:A B C D E F G
中序序列:C B E D A F G
可以唯一得到的二叉樹如圖 2(4):
中序序列:C B E D A F G

圖 2 構造二叉樹的過程示意圖
分析:通過前序序列得知,結點A為二叉樹的根結點,結合中序序列,在結點 A 左側的肯定為其左孩子中的所有結點,右邊為右孩子的所有結點,如圖 2(1)所示。
再分析 A 結點的左孩子,在前序序列看到,結點 A 后緊跟的是結點 B,由此斷定結點 A 的左孩子是 B,再看中序序列,結點 B 左側只有一個結點 C ,為 B 的左孩子,結點 B 右側的結點E 和 D 為右孩子,如圖 2(2)。
再分析結點 B 的右孩子,前序序列看到,結點 D 在 E 的前邊,所有 D 為 B 的右孩子。在中序序列中,結點 E 在 D 前邊,說明 E 是 D 的左孩子,如圖 2(3)。
最后分析結點 A 的右孩子,由前序序列看到, F 在 G 前邊,說明F為根結點。在中序序列中也是如此,說明,G 是 F 的右孩子。如圖 2(4)所示。
如果要唯一確定一棵二叉樹,必須知道至少兩種遍歷序列。如果只確定一種序列,無法准確判定二叉樹的具體構造。

圖 3 前序序列(1,2,3)的二叉樹
如圖 3 所示為前序序列(1,2,3)構建的不同形態的二叉樹,他們的中序序列各不相同。所以不同形態二叉樹的數目恰好就是前序序列一定的情況下,所能得到的不同的中序序列的個數。
中序序列是對二叉樹進行中序遍歷獲得的,遍歷的過程實質上就是結點數據進棧出棧的過程。所以,中序序列的個數就是數列(1,2,3)按1-2-3的順序進棧,
各元素選擇在不同的時間點出棧,所獲的的不同的出棧順序即為中序序列,而中序序列的數目,也就是不同形態的二叉樹的個數。

圖 4 中序遍歷時進棧和出棧的過程
根據數列中數據的個數 n,所得到的排列順序的數目為:

通過以上兩種方式,都可以知道n個結點能構建的不同形態的二叉樹的數量,再結合 tn=bn-1,就可以計算出 n 個結點能構建的不同形態的樹的個數。