96 不同的二叉搜尋樹

2021-09-26 23:57:30 字數 679 閱讀 1882

dp[ i ] 代表有 i 個結點(1.....i)時候的二叉搜尋樹種數。首先就是要考慮怎麼和之前的dp連線起來,也就是說選擇有幾種。

首先可以就直接把 i 這個數放在 i-1 二叉樹的根節點,二叉搜尋樹的種數就是dp[i-1]。如果把 i 放在左子樹,i-1是根節點,那就有dp[1]*dp[i-2] (左子樹*右子樹)。在把根節點放在左子樹,讓右子樹最大的作為根節點,以此類推。就可以得到狀態轉移矩陣:

dp[ i ] = dp[i-1]+dp[1]*dp[i-2]+....+dp[i-2]*dp[1]+dp[i-1]。

class solution:

def numtrees(self, n: int) -> int:

if n==0:

return 0

if n==1:

return 1

dp = [0]*(n+1)

dp[0] =1

dp[1] =1

for i in range(2,n+1):

for j in range(i):

dp[i]+=dp[j]*dp[i-j-1]

return dp[-1]

96 不同的二叉搜尋樹

給定乙個整數 n,求以 1 n 為節點組成的二叉搜尋樹有多少種?示例 輸入 3 輸出 5 解釋 給定 n 3,一共有 5 種不同結構的二叉搜尋樹 1 3 3 2 1 3 2 1 1 3 2 2 1 2 3思路 這個題目實際上是乙個數學題,設整數p組成的二叉樹共有c p 種情況。當給定乙個整數n的時候...

96 不同的二叉搜尋樹

二叉搜尋樹,又被稱為是二叉查詢樹 二叉排序樹,這種樹其左子樹所有節點的值均小於根節點的值,其右子樹所有節點的值均大於根節點的值,並且其左 右子樹均為二叉搜尋樹。空樹也是二叉搜尋樹。方法一 動態規劃法 這道題可以用動態規劃的思想去解決。由於給定的節點值為1 n,是一組從小到大順序排列的資料,其中,任意...

96 不同的二叉搜尋樹

題目.middle tree的定義就是遞迴的,所以關於樹的演算法也多採用遞迴。但是這個遞迴的話存在子問題重複計算的問題,所以用dp更好 package main import fmt type treenode struct func printtree root treenode else fmt...