文章目录
1. 不同的二叉搜索树的种数
给定一个整数 n
,求恰由 n
个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树的种数
示例:
输入:n = 3
输出:5
2. 解法
- 思路:动态规划
- 假设 n 个节点存在二叉排序树的个数是 dp (n),令 f(i) 为以 i 为根的二叉搜索树的个数,则 dp(n) = f(1) + f(2) + f(3) + f(4) + … + f(n)
- 当 i 为根节点时,其左子树节点个数为 i-1 个,右子树节点为 n-i,则 f(i) = dp(i-1)*dp(n-i)
- 综上递推公式为 dp(n) += dp(i-1)*dp(n-i)
- 当 n 为 0 时,没有数字,只能形成一种 BST :空树,则初始化 dp[0] = 1
public int numTrees(int n) {
if (n <= 1) {
return n;
}
int[] dp = new int[n + 1];
dp[0] = 1;
for (int k = 1; k <= n; k++) {
for (int i = 1; i <= k; i++) {
dp[k] += dp[i - 1] * dp[k - i];
}
}
return dp[n];
}