题目链接:
题目描述:
给一个数字n,那么有n个结点的二叉查找树共有多少棵。结点val对应从1到n。
例如:n=3
1 3 3 2 1
\ / / / \ \
3 2 1 1 3 2
/ / \ \
2 1 2 3
题目分析:
动态规划的硬伤,感谢这篇博客。
http://blog.youkuaiyun.com/jiadebin890724/article/details/23305915
二叉查找树的定义是,左子树的结点均小于root,右子树的结点均大于root。
当数组为1,2,3,4…i,…n时,基于以下原则的BST建树具有唯一性:
以i为根结点的树,其左子树由[1,i-1]构成,其右子树由[i+1,n]构成。
以i为根结点的树的种数等于其左子树的种数乘右子树的种树。
而n个结点的树,可以以1到n为根结点建树。
BST(n)=Sum(i,1,n,BST(i-1)*BST(n-i));
当i=4时,
j=1 num[4]=num[0]*num[3];
j=2 num[4]=num[1]*num[2];
j=3 num[4]=num[2]*num[1];
j=4 num[4]=num[3]*num[0];
把j=1~4累加起来。
j=1 num[4]=num[0]*num[3]; 相当于选1作为根结点,左子树无结点,此时左子树有num[0]种情况,右子树结点个数为3,此时右子树由num[3]种情况。
代码:
class Solution {
public:
int numTrees(int n) {
vector<int> num;
num.push_back(1);
for(int i=1;i<=n;i++){
num.push_back(0);
if(i<3){
num[i]=i;
}
else{
for(int j=1;j<=i;j++){
num[i]+=num[j-1]*num[i-j];
}
}
}
return num[n];
}
};