Leetcode No.96
阿新 • • 發佈:2019-05-08
red 分享 輸出 ima sub for mtr cti 遞推 XXXYYY XYXXYY XYXYXY XXYYXY XXYXYY
((())) ()(()) ()()() (())() (()())
給定一個整數 n,求以 1 ... n 為節點組成的二叉搜索樹有多少種?
示例:
輸入: 3 輸出: 5 解釋: 給定 n = 3, 一共有 5 種不同結構的二叉搜索樹: 1 3 3 2 1 \ / / / \ 3 2 1 1 3 2 / / \ 2 1 2 3
解答:
本題確切的含義是:用 n 個節點可以構成多少個二叉搜索樹(題目描述存在問題)。那麽用卡塔蘭數列(也稱明安圖數列)可以直接解決這個問題。
下面內容摘自wiki百科:
形式為:
遞推式為:
也滿足
應用可以有以下四種情況:
- Cn表示長度2n的dyck word的個數。Dyck word是一個有n個X和n個Y組成的字串,且所有的前綴字串皆滿足X的個數大於等於Y的個數。以下為長度為6的dyck words:
- 將上例的X換成左括號,Y換成右括號,Cn表示所有包含n組括號的合法運算式的個數:
- Cn表示有n個節點組成不同構二叉樹的方案數。下圖中,n等於3,圓形表示節點,月牙形表示什麽都沒有。
- Cn表示有2n+1個節點組成不同構滿二叉樹(full binary tree)的方案數。下圖中,n等於3,圓形表示內部節點,月牙形表示外部節點。本質同上。
- Cn表示所有在n × n格點中不越過對角線的單調路徑的個數。一個單調路徑從格點左下角出發,在格點右上角結束,每一步均為向上或向右。計算這種路徑的個數等價於計算Dyck word的個數:X代表“向右”,Y代表“向上”。下圖為n = 4的情況:
- Cn表示通過連結頂點而將n + 2邊的凸多邊形分成三角形的方法個數。下圖中為n = 4的情況:
- Cn表示用n個長方形填充一個高度為n的階梯狀圖形的方法個數。下圖為n = 4的情況:
- Cn表示n個無標號物品的半序的個數。
//96 卡塔蘭數列 int numTrees(int n) { if(n<2) return 1; long res=1; for(int i=1;i<n;i++) res =res * 2*(2*i+1)/(i+2); return (int)res; }//96
Leetcode No.96