输入: 3
输出: 5
解释:
给定 n = 3, 一共有 5 种不同结构的二叉搜索树:
1 3 3 2 1
\ / / / \ \
3 2 1 1 3 2
/ / \ \
2 1 2 3
二叉搜索树:左边节点都比根节点小,右边节点都比根节点大。
有规律可以得出是标准卡特兰数:
h(n) = h(0)*h(n-1) + h(1)*h(n-2) + ... + h(n-1)*h(0) (n>=2)
h(n) = C(2n,n)/(n+1),n=0,1,2,3,... (其中C(2n,n)表示2n个物品中取n个的组合数)
class Solution {
public:
int numTrees(int n) {
if(n <= 1)
return 1;
int dp[n+1];
memset(dp,0,sizeof(dp));
dp[0] = 1;
for(int i = 1; i <= n;++i)
{
int sum = 0;
for(int j = 0;j < i; ++j)
sum += dp[j] *dp[i-j-1];
dp[i] = sum;
}
return dp[n];
}
};