解题代码:
classSolution {
public:
int numTrees(int n) {
if(n<=0)
return 0;
if(n==1)
return 1;
vector<int> res(n+1,0);
res[1]=1;
int i=2;
while(i<=n){
res[i]+=res[i-1]*2;
for(int j=i-2;j>0;j--){
res[i]+=res[j]*res[i-j-1];
}
i++;
}
return res[n];
}
};
解题思路:
题目要求找出由1到n共n个数组成的不同的二叉查找树的个数。设为f(n),同时,f(n)也可以理解为n个不同的数能组成不同的二叉查找树的个数。显然f(1)=1。对于n大于1的情况,我们可以考虑到,对于1<=i<=n,若i作为根节点,共有i-1个数在i的左边,它们的排列方式的可能性共有f(i-1),而有n-i个数在i的右边,它们的排列方式的可能性共有f(n-i)。因此,对于每个i作为根节点,都有f(i-1)* f(n-i)种排列方式(其中,为方便计算,设f(0)=1)。所以有:
f(n)=f(n-1)*f(0)+f(n-2)*f(1)+……+f(i-1)*f(n-i)+……+f(0)*f(n-1)