leetcode0096. 不同的二叉搜索树-medium
1 题目:不同的二叉搜索树
官方标定难度:中
给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。
示例 1:
输入:n = 3
输出:5
示例 2:
输入:n = 1
输出:1
提示:
1 <= n <= 19
2 solution
根据根节点进行分类,n 个节点的二叉搜索树有 d p n dp_n dpn 个,则有
d p n = ∑ i = 0 n − 1 d p i ∗ d p n − i − 1 dp_n = \sum_{i = 0} ^ {n -1} dp_i * dp_{n- i - 1} dpn=i=0∑n−1dpi∗dpn−i−1
所以直接递推即可
代码
class Solution {
public:
int numTrees(int n) {int dp[n + 1];dp[0] = dp[1] = 1;for(int i = 2; i <= n; i++){dp[i] = 0;for(int l = 0; l < i; l++){dp[i] += dp[l] * dp[i - l - 1];}}return dp[n];
}
};
结果
3 进阶
这其实就是卡特兰数,有更简单的地推公式。
d p n = d p n − 1 ⋅ 4 ∗ n − 2 i + 1 dp_n = dp_{n-1} \cdot \frac {4 * n - 2} {i + 1} dpn=dpn−1⋅i+14∗n−2
代码
class Solution {/** C(n) = c(2n, n) - c(2n, n-1) = n+2...2n / n!* C(n) / C(n - 1) = (4n-2) / (n+1)* C(1) = 1*/
public:int numTrees(int n) {int s = 1; //for (int i = 2; i <= n; i++) {s = 1ll * s * (4 * i - 2) / (i + 1);}return s;}
};