不同的二叉查詢樹
給出 n,問由 1…n 為節點組成的不同的二叉查詢樹有多少種?
樣例 1:
輸入:n = 3
輸出:5 解釋:
有5種不同形態的二叉查詢樹
1 3 3 2 1
\ / / / \ \
3 2 1 1 3 2
/ / \ \
2 1 2 3
解答:
定義dp[i] 為當節點數為i時,二叉查詢樹的種類數
看如下規律:
當節點為0時:dp[0] = 1
當節點為1時:dp[1] = 1
當節點為2時:dp[2] = dp[1] + dp[1] = 2
當節點為3時:dp[3] = dp[2] + dp[1] * dp[1] + dp[2] = 5
當節點為4時:dp[4] = dp[3] + dp[1] * dp[2] + dp[2] * dp[1] + dp[3] = 14
當節點為5時:dp[5] = dp[4] + dp[1] * dp[3] + dp[2] * dp[2] + dp[3] * dp[1] + dp[4] = 42
…以上是何意呢?
舉乙個例子,假設節點為4,每乙個節點都有成為根節點的機會:
當節點1為根節點時,左子樹是0個節點,右子樹是3個節點,左子樹0個節點的表現形式有dp[0]種,右子樹3個節點的表現形式有dp[3]種,左右組合則有dp[0] * dp[3]種
當節點2為根節點時,左子樹是1個節點,右子樹是2個節點,左子樹1個節點的表現形式有dp[1]種,右子樹2個節點的表現形式有dp[2]種,左右組合則有dp[1] * dp[2]種
當節點3為根節點時,左子樹是2個節點,右子樹是1個節點,左子樹2個節點的表現形式有dp[2]種,右子樹1個節點的表現形式有dp[1]種,左右組合則有dp[2] * dp[1]種
當節點4為根節點時,左子樹是3個節點,右子樹是0個節點,左子樹3個節點的表現形式有dp[3]種,右子樹0個節點的表現形式有dp[0]種,左右組合則有dp[3] * dp[0]種
故狀態轉換方程為:
dp[i] = dp[0]*dp[i] + dp[1]*dp[i-1] + … + dp[i-1]*dp[1] + dp[i]*dp[0];
可在運算過程優化,計算前半段乘以2即可
class
solution
dp[0]
=1; dp[1]
=1;for
(int i =
2; i < m; i++)}
int nret = dp[n]
;delete
dp;
return nret;}}
;
動態規劃(不同的二叉搜尋樹)
考慮 的所有解 null 考慮 1 的所有解 1考慮 12 的所有解 2 11 2 考慮 12 3 的所有解 3 2 1 2 13 3 1 21 3 21 2 3思路 當我們增加乙個大於之前的數字時,新增的數字出現的位置只能是根節點或根節點的右孩子 右孩子的右孩子等等。接著,新數字所在位置原來的子樹...
95 不同的二叉搜尋樹 II,動態規劃
不同的二叉搜尋樹 ii 給定乙個整數 n,生成所有由 1 n 為節點所組成的 二叉搜尋樹 示例 輸入 3 輸出 1,null,3,2 3,2,null,1 3,1,null,null,2 2,1,3 1,null,2,null,3 解釋 以上的輸出對應以下 5 種不同結構的二叉搜尋樹 1 3 3 2...
96 不同的二叉搜尋樹(動態規劃 數學)
1.問題描述 給定乙個整數 n,求以 1 n 為節點組成的二叉搜尋樹有多少種?輸入 3 輸出 5 解釋 給定 n 3,一共有 5 種不同結構的二叉搜尋樹 1 3 3 2 1 3 2 1 1 3 2 2 1 2 3 2.思路分析 一開始的時候想到使用遞迴的思路解決,可以使用遞迴建立出二叉搜尋樹 以當前...