思路:可用递归,由大化小;也可使用迭代;也可投机取巧,由公式直接得出;
方法一:投机取巧,由组合公式2n中取n个的排列个数/(n+1),即为二叉搜索树形态个数。
public class Solution {
public int numTrees(int n) {
java.math.BigInteger sum1=java.math.BigInteger.ONE,sum2=java.math.BigInteger.ONE;
for(int i=1;i<=n;i++)
sum2=sum2.multiply(java.math.BigInteger.valueOf(i));
for(int i=n+2;i<=2*n;i++)
sum1=sum1.multiply(java.math.BigInteger.valueOf(i));
return sum1.divide(sum2).intValue();
}
}
方法二:递归实现
public class Solution {
public int numTrees(int n){
if(n==0||n==1)
return 1;
int sum=0;
for(int i=1;i<=n;i++)
sum+=numTrees(i-1)*numTrees(n-i);
return sum;
}
}
方法三:迭代
public class Solution {
public int numTrees(int n) {
int ans[]=new int[n+1];
ans[0]=1;
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
ans[i]+=ans[j-1]*ans[i-j];
return ans[n];
}
}