leetcode 96 不同的二叉搜尋樹

2021-09-22 02:15:47 字數 1369 閱讀 1283

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

示例:

輸入: 3

輸出: 5

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

1 3 3 2 1

\ / / / \ \

3 2 1 1 3 2

/ / \ \

2 1 2 3

解題技巧:一般來說求數量,要首先想到使用動態規劃(dp),而如果是像下一題的要求,不只是數量,還要把所有的樹都列舉出來,就要使用dfs(深度優先搜尋)來遍歷決策樹了。

思路:

n=0時,為空樹,那麼dp[0]=1; n=1時,顯然也是1,dp[1]=1;n=2時,dp[2]=2;  

class solution:

def numtrees(self, n):

dp = [0]*(n+1)

dp[0],dp[1] = 1,1

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

for j in range(i):

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

return dp[n]

"""假設n個節點存在二叉排序樹的個數是g(n),令f(i)

為以i為根的二叉搜尋樹的個數

即有: g(n) = f(1) + f(2) + f(3) + f(4) + ... + f(n)

n為根節點,當i為根節點時,其左子樹節點個數為[1, 2, 3, ..., i - 1],右子樹節點個數為[i + 1, i + 2, ...n],

所以當i為根節點時,其左子樹節點個數為i - 1

個,右子樹節點為n - i,即f(i) = g(i - 1) * g(n - i),

上面兩式可得: g(n) = g(0) * g(n - 1) + g(1) * (n - 2) + ... + g(n - 1) * g(0)

"""if __name__ == '__main__':

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

# 二叉搜尋樹:左邊比它大,右邊比它小

n = 3

print(solution().numtrees(n))

參考:

leetcode 96. 不同的二叉搜尋樹(python3)

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 ...