方法: 动态规划
假设 n
个节点存在的二叉排序树的个数是G(n)
,令f(i)
表示以i
为根的二叉搜索树的个数,则存在G(n)=f(1)+f(2)+ ··· +f(n)
- 当
i
为根节点时,其左子树节点个数为i-1
个,右子树节点个数为n-i
个,则f(i)=G(i-1)*G(n-i)
- 边界
G(0)=1
,G(1)=1
(当n = 1,i = 1
时,G(1) = f(1) = G(0)* G(0)
,则G(0) = 1
。可以理解为G(0) = 1
是人为规定的,只存在于公式中,不存在于实际问题中。 - 卡特兰数公式:
G(n)=G(0)*G(n-1)+G(1)*G(n-2)+···+G(n-1)*G(0)
class Solution {
public:
int numTrees(int n) {
vector<int> dp(n+1,0);
dp[0]=1;
dp[1]=1;
for(int i=2;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
dp[i]+=dp[j-1]*dp[i-j];
}
}
return dp[n];
}
};