分析:
二叉搜索树即左子树均小于根节点,右子树均大于根节点(中序遍历后为有序列表)
假设G(n)代表n个节点组成的二叉搜索数的结果,我们设根节点为i的节点有f(i)中二叉树则有
G(n)=f(1)+f(2)+...+f(i)+...+f(n)
对于f(i)=i-1组成的左子树* n-i组成的右子树,左右子树相互独立不影响直接相乘,即
f(i) = G(i-1)*G(n-i)
两个公式结合,得出状态方程
G(n)=G(0)*G(n-1) + ... + G(i-1)*G(n-i) + ... + G(n-1)(0)
满足上述公式的即为卡特兰数 贴出代码:
public static int numTrees(int n) {
int[] dp = new int[n+1];
dp[0]=0;
dp[1]=1;
for (int i = 2; i <= n; i++) {
for (int j = 1; j <= i; j++) {
dp[i] += dp[j - 1] * dp[i - j];
}
}
return dp[n];
}