給定乙個整數 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 ...