leetcode 96 不同的二叉搜尋樹

2021-10-08 00:09:20 字數 2085 閱讀 5633

96. 不同的二叉搜尋樹

給定乙個整數 n,求以 1 … n 為節點組成的二叉搜尋樹有多少種?

示例:輸入: 3

輸出: 5

解釋:給定 n = 3, 一共有 5 種不同結構的二叉搜尋樹:

舉例

1         3     3      2      1

\ / / / \ \

3 2 1 1 3 2

/ / \ \

2 1 2 3

可以分析之後發現這裡面的構造是有一定規律的,首先我們設定乙個dp列表,表示對應輸入個數的不同結構數量,初始化 dp[0] = 1,我們從2開始找規律。

當 n = 2時,dp[2] = 2 = dp[0]dp[1] + dp[1]dp[0]

1         2     

\ /

2 1

當 n = 3時,dp[3] = 5 = dp[0]dp[2] + dp[1]dp[1] + dp[2]dp[0]
1         3     3      2      1

\ / / / \ \

3 2 1 1 3 2

/ / \ \

2 1 2 3

依次類推,可以得到n的不同組合數量。

在程式設計的時候,由兩層for 迴圈巢狀。

第一層:由上述式子我們得知,要計算 n, 首先要知道1~ n-1的dp值,所以需要先求前面的dp值。

第二層:計算每乙個確定的dp值,具體的計算方式就是上述的公式

from typing import list

class

solution

:def

numtrees

(self, n:

int)

->

int:

dp =[0

]*(n+1

) dp[0]

=1res =

0for i in

range(1

, n+1)

:for j in

range(0

, i)

: dp[i]

+= dp[j]

*dp[i-j-1]

return dp[-1

]if __name__ ==

"__main__"

: s = solution(

)print

(s.numtrees(6)

)

#發現規律,可以在第二個for 中計算dp[n],數量減半

class

solution

:def

numtrees

(self, n:

int)

->

int:

dp =[0

]*(n+1

) dp[0]

= dp[1]

=1for i in

range(2

, n+1)

: res =

0for j in

range(0

, i//2)

:# if 2*j == i-1:

# res += dp[j]*dp[j]

# break

res += dp[j]

*dp[i-j-1]

*2if i %2==

1:res += dp[

(i-1)//

2]*dp[

(i-1)//

2]dp[i]

= res

return dp[-1

]

leetcode 96 不同的二叉搜尋樹

給定乙個整數 n,求以 1 n 為節點組成的二叉搜尋樹有多少種?示例 輸入 3 輸出 5 解釋 給定 n 3,一共有 5 種不同結構的二叉搜尋樹 1 3 3 2 1 3 2 1 1 3 2 2 1 2 3n 0 表示,有0個點,那麼,可以組成的二叉查詢樹就乙個,那就是空樹 n 1表示,有1個點,那麼...

Leetcode 96 不同的二叉搜尋樹

給定乙個整數 n,求以 1 n 為節點組成的二叉搜尋樹有多少種?示例 輸入 3 輸出 5 解釋 給定 n 3,一共有 5 種不同結構的二叉搜尋樹 1 3 3 2 1 3 2 1 1 3 2 2 1 2 3主要參考 本題其實是構造卡特蘭數的應用,採用動態規劃思想求解。通過求解出子問題來實現最終問題的求...

leetcode96 不同的二叉搜尋樹

給定乙個整數 n,求以 1 n 為節點組成的二叉搜尋樹有多少種?示例 輸入 3 輸出 5 解釋 給定 n 3,一共有 5 種不同結構的二叉搜尋樹 1 3 3 2 1 3 2 1 1 3 2 2 1 2 3 我們把n 0 時賦為1,因為空樹也算一種二叉搜尋樹,假設n個節點存在二叉排序樹的個數是g n ...