1. 程式人生 > >N個節點的二叉樹有多少種形態(卡特蘭數)

N個節點的二叉樹有多少種形態(卡特蘭數)

面試 誤區 樹的定義 節點 類型 基礎 更多 大於等於 證明

這是一道阿裏的面試題。其實算不上新鮮,但是我之前沒關註過,如今碰到了,就順便探討下這個問題吧:)

拿到這個題,首先想到的是直接寫出表達式肯定不行,所以有必要從遞推入手。由特殊到一般,歸納法麽~而且二叉樹離不開遞推這個尿性。。。

先考慮只有一個節點的情形,設此時的形態有f(1)種,那麽很明顯f(1)=1

如果有兩個節點呢?我們很自然想到,應該在f(1)的基礎上考慮遞推關系。那麽,如果固定一個節點後,有兩種情況,一是左子樹還剩一個節點,此刻類型數量為f(1),第二種情況是右子樹生一個節點,此刻類型數量為f(1),固有f(2) = f(1) + f(1)

如果有三個節點呢?我們需要考慮固定兩個節點的情況麽?當然不行,為什麽?

因為當節點數量大於等於2時,無論你如何固定,其形態必然有多種,而在這多種基礎之上你如何安排後續剩下的節點呢?所以必須挑出這個誤區。

回到二叉樹的定義,二叉樹本質上就是一個遞歸的形式,左子樹,右子樹,根節點。所以根節點應該不變,需要遞歸處理的是左右子樹。

也就是說,還是考慮固定一個節點,即根節點。好的,按照這個思路,還剩2個節點,那麽左右子樹的分布情況為2=0+2=1+1=2+0。

所以有3個節點時,遞歸形式為f(3)=f(2) + f(1)*f(1) + f(2). (註意這裏的乘法,因為左右子樹一起組成整棵樹,根據排列組合裏面的乘法原理即可得出)

那麽有n個節點呢?我們固定一個節點,那麽左右子樹的分布情況為n-1=n-1 + 0 = n-2 + 1 = ... = 1 + n-2 = 0 + n-1

OK。遞歸表達式出來了f(n) = f(n-1) + f(n-2)f(1) + f(n-3)f(2) + ... + f(1)f(n-2) + f(n-1)

觀察一下這個表達式,嗯,和我們之前見過的遞歸表達有一點區別,遞推層級為n的時候,更多的是考慮前一步(n-1),或者前兩步(n-1)和(n-2)。

但是這裏卻考慮到所有的情況,即1到n-1。

最後說明一下,這個表達式有一個學名,叫做Catalan數。上面我們沒有定義f(0)。如果把f(0)也考慮進去,顯然沒有節點也只有一種情況,即f(0)=1

標準表達式為f(n) = f(n-1)f(0) + f(n-2)f(1) + f(n-3)f(2) + ... + f(1)f(n-2) + f(n-1)f(0)

前幾個數為1,1,2,5,14,42,132。

此外,還有一個通項公式為1/(n+1) * C(n, 2n) = C(n, 2n) - C(n-1, 2n) , n = 0,1,2,...

有興趣的同學可以參考組合數學相關書籍,這裏就不累述其證明和推導了。

N個節點的二叉樹有多少種形態(卡特蘭數)