動態規劃之不同的二叉查詢樹

2021-10-13 13:02:53 字數 1530 閱讀 1485

不同的二叉查詢樹

給出 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.思路分析 一開始的時候想到使用遞迴的思路解決,可以使用遞迴建立出二叉搜尋樹 以當前...