动态规划的思想,dp[i]表示有i个结点可以构成的二叉树结构情况数。
遍历选取第j个结点作为根节点,则dp[n]+=dp[j-1]*dp[i-j]
class Solution {
public:
int numTrees(int n) {
if(n<0)
return 0;
int dp[2000]={0};
dp[0]=1;
dp[1]=1;
for(int i=2;i<=n;i++) //结点总个数
{
for(int j=1;j<=n;j++) //选取第几个结点作为根结点
{
dp[i] += dp[j-1]*dp[i-j]; //dp[左子树个数]*dp[右子树个数]
}
}
return dp[n];
}
};