對於二叉樹形態,能夠從二叉樹自己的規律去找,離不開遞推數據結構
先考慮只有一個節點的狀況,設此時的形態爲f(1)種,很明顯f(1)=1; 那麼有兩個節點的時候呢?咱們很容易的想到,應該在一個節點的基礎上考慮遞推關係。因此,當固定一個節點後,有兩種狀況,一種是左子樹一個節點,一種是右子樹一個節點,共有兩種狀況,因此f(2) = f(1)+f(1);當三個節點的時候呢?咱們要考慮固定兩個節點嗎?看樣子好像不行,由於固定兩個節點的形態不是惟一的。 那麼當節點數量大於2的時候,咱們是在固定不一樣的形態的基礎下,在安排剩下的節點嗎? 咱們應該這樣想,固定一個節點就是根節點,二叉樹原本就是由左子樹,右子樹,根節點組成的,因此固定根節點,遍歷左右子樹。 下圖是3個節點的形態圖函數
當固定根節點時,剩下2個節點,分紅以下幾種狀況,左2右0,左1右1,左0右2 這三種狀況。 因此f(3)=f(2)+f(1)
f(1)+f(2) ,當有n個節點呢?此時咱們固定根節點左右子樹的分佈狀況爲(n-1,0),(n-2,1),(n-3,2)...(2,n-3),(1,n-2),因此咱們不難推出f(n)=f(n-1)+f(n-2)f(1)+....+f(1)f(n-2)+f(n-1),經過表達式能夠看出,這和普通的遞歸表達式有點區別,不是單純的看前一步或前兩步,而是考慮到從1到n-1的狀況,這裏咱們能夠定義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),這個表達式叫作
Catalan數 。那麼咱們會想這個表達式有沒有通項公式呢,答案是確定的。
Catalan數通項公式推導
在推導通項公式以前,首先說一下生成函數 Catanlan數通向公式推導過程,這裏用到了生成函數:咱們能夠寫出f(n)的生成函數:f(x) = f(0)x^0+f(1)x+f(2)x^2+...+...
[f(x)]²= f(0)^2x^0+(f(0)f(1)+f(1)f(0))x+(f(0)f(2)+f(1)f(1)+f(2)f(0))x^2+...+(f(0)f(n-1)+f(1)f(n-2)+...+f(n-1)f(0))x^(n-1)+...
由於f(n) = f(n-1)f(0) + f(n-2)f(1) + f(n-3)f(2) + ... + f(1)f(n-2) +... 因此[f(x)]^2 = f(0)+f(2)x+f(3)x^2+...+f(n)x^(n-1)+...,由於f(0)=f(1)=1, 因此[f(x)]^2 = f(x)-f(1)x = f(x)-x,解得.net
, 根據廣義牛頓二項式,將f(x)進行泰勒級數展開得
因此
Catalan數的應用
使用Catalan數解決的問題
進出棧問題:棧是一種先進後出(FILO,First In Last Out)的數據結構.以下圖1,1,2,3,4順序進棧,那麼一種可能的進出棧順序是:1In→2In→2Out→3In→4In→4Out→3Out→1Out, 因而出棧序列爲1,3,4,2。那麼一個足夠大的棧的進棧序列爲1,2,3,⋯,n時有多少個不一樣的出棧序列?
凸多邊形的三角形劃分。一個凸的n邊形,用直線鏈接他的兩個頂點使之分紅多個三角形,每條直線不能相交,問一共有多少種劃分方案。 這也是很是經典的一道題。咱們能夠這樣來看,選擇一個基邊,顯然這是多邊形劃分完以後某個三角形的一條邊。圖中咱們假設基邊是p1pn,咱們就能夠用p一、pn和另一個點假設爲pi作一個三角形,並將多邊形分紅三部分,除了中間的三角形以外,一邊是i邊形,另外一邊是n-i+1邊形。i的取值範圍是2到n-1。因此本題的解c(n)=c(2)*c(n-1)+c(3)*c(n-2)+...c(n-1)*c(2)。令t(i)=c(i+2)。則t(i)=t(0)*t(i-1)+t(1)*t(i-2)...+t(i-1)*t(0)。很明顯,這就是一個卡特蘭數了。
在圓上選擇2n個點,將這些點成對鏈接起來,使得所獲得的n條線段不相交的方法數。
矩陣鏈乘:P=a1×a2×a3×……×an,依據乘法結合律,不改變其順序,只用括號表示成對的乘積,試問有幾種括號化的方案?