給定乙個整數 n,求以 1 ... n 為節點組成的二叉搜尋樹有多少種?
示例:輸入: 3
輸出: 5
解釋:給定 n = 3, 一共有 5 種不同結構的二叉搜尋樹:
1 3 3 2 1
\ / / / \ \
3 2 1 1 3 2
/ / \ \
2 1 2 3
class solution(object):
def numtrees(self, n):
""":type n: int
:rtype: int
"""g = [0]*(n+1)
g[0] = g[1] = 1
for i in range(2, n+1):
for j in range(1, i+1):
g[i] += g[j-1]*g[i-j]
return g[n]
假設有從1到n的n個節點,每個節點作為根節點來組成二叉搜尋樹。比如我們有1,2,...,5,一共五個節點,我們任取乙個節點為根節點,我們假設取的是2,那麼就可以以2為根將剩下4個節點分為兩部分,即和。那麼對於這兩部分我們分別去計算一共有多少種構建二叉搜尋子樹的方法。對於左子樹由於只剩乙個節點,可能性只有一種,而對於右子樹而言,有三個節點存在,那麼我們又需要對其進行進一步的計算,原理如上,最後我們能獲得5種可能的組合。那麼最後對於我們原來的節點2而言,一共存在1*5可能。至此我們已經計算得出2作為根節點的所有可能性,那麼我們只需要求出每個節點作為根的可能性,再將其求和,就能得到n個節點的所有可能組合數。
用公式來描述我們的問題。
對於1到n的n個數,我們用g(n)來表示n個數最多能有多少種二叉搜尋樹。f(i, n)表示以i為根節點的所有組合可能。
而對於f(i, n),我們有如下推導:
對於i節點而言,它有i-1個左子節點,n-i個右子節點。
所以最後得到:
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 ...