卡特蘭數

1 引入問題

  對於一顆有N個節點的二叉樹,能夠變化成多少種形態呢?例如:一、三、五、六、九、10能夠組成多少種不一樣的二叉樹形態?spa

2 卡特蘭數

  百度百科搜「卡特蘭數」看了半天沒看懂,可是搜了一個網頁後看懂了遞推思路了:.net

  對於一個規模爲n的問題,先找一個元素固定下來,而後將剩下的n-1個元素拆分紅兩個子問題。卡特蘭數一些項:h(0)=1(規定),h(1)=1,h(2)=2,h(3)=5,h(4)=14,h(5)=42,h(6)=132,h(7)=429,h(8)=1430,h(9)=4862,h(10)=16796,h(11)=58786,h(12)=208012,h(13)=742900,h(14)=2674440,h(15)=9694845 ····················  blog

  

  關於公式的說明,參考下網友這篇文章《卡特蘭數get

3 二叉樹形態推理

  常規套路,先選一個點當根節點,用f(n)表示n個節點的二叉樹不一樣的形態數,假設左子樹有i個節點,右子樹有n-i-1個節點,那麼根據乘法原理,就有f(i)*f(n-i-1)種方案.把每一個點爲根的方案數加起來就是答案:f(n) = Σf(i)*f(n-i-1)。原理

4 其餘相似問題

4.1 AB排列問題

   有n個A和n個B排成一排,從第1個位置開始到任何位置,B的個數不能超過A的個數,問:這樣的排列有多少種?百度

   分析:從公式入手。符合要求的排列數=總的排列數-不符合要求的排列數。由於要在2n個位置中選擇n個位置放A,因此總的排列數爲C(2n,n).再來看如何求不符合要求的排列數。首先確定是要找不符合要求的排列有什麼特徵,一個不符合要求的排列的特徵是:存在一個奇數位2*k+1,有k+1個B,k個A,根據這個還不能獲得答案。將2*k+2到n*2位上的A,B互換一下,能夠發現最後獲得的排列必定是有n+1個B,n-1個A的,也就是說一旦一個排列通過這種操做後有n+1個B,那麼這個排列就是不合法的,由於變換前的排列和變換後的排列是一一對應的,咱們只須要求出變換後的排列有多少種,就能知道變換前的排列有多少種。即C(2n,n+1)種,答案爲C(2n,n) - C(2n,n+1)。正好就是卡特蘭數。二叉樹

4.2 乘法括號問題

  乘法加括號:對於連乘a1*a2*a3*......*an,加了括號後就可改變它的運算順序。問:有多少種不一樣的運算順序?方法

  分析:常規套路,先選一個乘號當根節點,構造二叉樹,乘號左邊就是它的左子樹,乘號右邊就是它的右子樹,剩下的就轉化爲了例1.im

4.3 歐拉多邊形分隔問題

  設有一個凸多邊形,能夠用n-3條不相交的對角線將n邊形分紅n-2個互相沒有重疊的三角形,例如n=5,有5種方法。qq

  分析:仍是要先找一個元素給固定下來,對於邊V1Vn,任選一頂點Vk,向V1和Vn連邊。將三角形V1VnVk分割出去,剩下兩個多邊形,一個多邊形有頂點{1,2,3,…,k},因此是k邊形;另外一個多邊形有頂點{k,k+1,…,n},因此是(n-k+1)邊形。這就是類卡特蘭數了.最後的答案爲f(n) = Σf(k)*f(n-k+1)。

  參考《卡特蘭數之凸多邊形的三角分隔法

相關文章
相關標籤/搜索