典型的动态规划。 考虑数字k为根节点的情况。 则此时的可能情况有dp[k-1]*dp[n-k]种,即左右字数的可能性的组合。 充分考虑每个点作为顶点的可能即可。
public class Solution {
public int numTrees(int n) {
int []a = new int[n+1];
if(n<=1)
{
return 1;
}
a[0]=1;a[1]=1;a[2]=2;
for(int i=3;i<=n;i++ )
{
a[i]=0;
for(int j=1;j<=i;j++ )
{
a[i]+=a[j-1]*a[i-j];
}
}
return a[n];
}
}