输入: 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]; } };