不同的二叉搜索树(卡塔兰数)
// 动态规划
// 1 2 3 4 5 6 7
// 假设选取 4 为根节点,存在不同搜索二叉树的个数为:(1 2 3)能构成不同搜索二叉树的个数 * (5 6 7)能构成不同搜索二叉树的个数
// 卡塔兰数递推式↓
// h(n) = h(0) * h(n-1) + h(1) * h(n-2) + ... + h(n-1) * h(0) (n≥2)
class Solution {
public int numTrees(int n) {
int[] dp = new int[n + 1];
dp[0] = 1;
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];
}
}