题目
给定一个整数 n,求以 1 … n 为节点组成的二叉搜索树有多少种?
样例
题解
dp[i]为i个节点组成的BST有几种。
i个节点组成的树可分为一个根节点和两个子树,字数的大小为[0,i-1]
dp[i]=两个子树的种类的积
d
p
[
i
]
=
∑
1
i
d
p
[
j
−
1
]
×
d
p
[
i
−
j
]
dp[i]=\sum_1^idp[j-1]\times dp[i-j]
dp[i]=∑1idp[j−1]×dp[i−j]
//C++
class Solution
{
public:
int dp[10010];
int numTrees(int n)
{
dp[0]=1;dp[1]=1;dp[2]=2;
for(int i=3;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
dp[i]+=dp[j-1]*dp[i-j];
}
}
return dp[n];
}
};
#python3
class Solution:
def numTrees(self,n:int)->int:
dp=[0]*(n+1)
dp[0]=1
dp[1]=1
for i in range(2,n+1,1):
for j in range(1,i+1,1):
dp[i]+=dp[j-1]*dp[i-j]
return dp[n]
时间复杂度为 O ( n 2 ) O(n^2) O(n2)