问题:给出n,请问这1,2...n个数,能构成多少种二叉排序树
思路:动态规划。遍历1...n,i作为根节点,则根节点左边有f(i-1)种可能,右边有f(n-i)种可能,所以以i为根节点时有f(i-1)*f(n-i)种可能,循环即可。
class Solution {
public:int numTrees(int n) {
if(n<0) return -1;
if(n==0) return 0;
int* dp=new int[n+1];
//init
for(int i=0;i<n+1;i++){
dp[i]=0;
}
dp[1]=1;
//process
for(int i=2;i<n+1;i++){
dp[i]=dp[i-1]+dp[i-1];
for(int j=2;j<i;j++){
dp[i]+=dp[j-1]*dp[i-j];
}
}
//result
int result=dp[n];
delete []dp;
return result;
}
};