給定一個整數 n,求以 1 ... n 爲節點組成的二叉搜索樹有多少種?web
對於n個結點,除去了跟結點,還剩餘n-1個結點,所以左右子樹的結點數分配方式以下:ide
假定G(n)表示由連續的n個數造成的二叉搜索樹的個數,而且以i做爲分界點,svg
那麼左子樹爲G(i-1),右子樹爲G(n-i),那麼公式則爲:post
能夠發現這就是卡特蘭數的應用,這種應用一般使用動態規劃來解決;spa
class Solution(object):
def numTrees(self, n):
"""
:type n: int
:rtype: int
"""
dp = [0] * (n+1)
dp[0] = dp[1] = 1
# 假定一共有n個數,而且以j做爲分界線
for i in range(2, n+1):
for j in range(1, i+1):
dp[i] += dp[j-1] * dp[i-j]
return dp[n]