描述
给定一个值n,能构建出多少不同的值包含1...n的二叉搜索树(BST)?
例如
给定 n = 3, 有五种不同的二叉搜索树(BST)
示例1
输入:
3
返回值:
5
class Solution {
public:
int numTrees(int n) {
//bool odd; //是否是奇数的标示
/*
vector<int> array;
array.push_back(1); //f0=1
array.push_back(1); //f1=1
array.push_back(2); //f2=2
array.push_back(5); //f3=5
for(int i=4;i<=n;i++){
if((i&1)==1){
//odd = true;
int half = i>>1;
int sum=0;
int j;
for(j=0;j<half;j++){
sum += array[j]*array[i-1-j];
}
sum *= 2;
sum += array[half]*array[half];
array.push_back(sum); //fn
}else{
//odd = false;
int half = i>>1;
int sum=0;
for(int j=0;j<half;j++){
sum += array[j]*array[i-1-j];
}
array.push_back(2*sum); //fn
}
}
return array[n];
*/
//方式二:如果了解卡特兰数列的话,其实二叉搜索树的形态结构树就是一个卡特兰数列
//直接套用公式计算 h(n)=C(2n,n)/(n+1)={2n(2n-1)(2n-2)...(n+2)}/{n(n-1)(n-2)...1} 组合数需要计算阶乘
//可以采用递推公式 h(n)=(4n-2)/(n+1)*h(n-1) 来计算
int fn_1 = 1,fn;
if(n==1)return fn_1;
for(int i=2;i<=n;i++){
fn = (float)(4*i-2)/(i+1)*fn_1;
fn_1 = fn;
}
return fn;
}
};