题目:找出以1..n为元素值的所有bst的个数
分析:
对于n=1,那么就只有1个
对于n=2,可以以1为root,剩下一个2就放右边;也可以以2为root,剩下的1放左边,一共2个
对于3呢?同样可以尝试分别以1 2 3作为root,其余的作为子树
总之,对于n,可以把1...n分别作为root,答案为这些情况之和
考虑当把k做为root时,那么1到k-1必在左子树,k+1到n必在右子树,所以k为root时的所有个数为左子树的种数*右子树的种数
那么将k=1...n加起来,即为n时的种数了,通项公式为:
考虑到公式里每项r(?)都比r(n)小,所以只需要从小到大把r给算出来,算到n就可以了
答案:
class Solution {
public:
int numTrees(int n) {
vector <int> res;
for (int i = 0; i<=n; i++){
res.push_back(0);
}
res[0] = 1;
res[1] = 1;
for (int i = 2; i<=n; i++){
for (int k = 1; k <=i; k++)
res[i] = res[i] + res[k-1] * res[i-k];
}
return res[n];
}
};