问题描述
给定一个整数 n,求出从 1 到 n 的不同二叉搜索树(BST)的数量。
示例
示例 1: 输入: n = 3 输出: 5 解释: 给定 n = 3, 有五种不同的 BSTs: 1 3 3 2 1 \ / / / \ / 3 2 1 1 3 2 3 / / \ / 2 1 2 1
示例 2: 输入: n = 1 输出: 1
解法一
解题思路: 动态规划。定义 dp[i] 表示以 i 个节点能组成的不同二叉搜索树的个数。对于根节点 i,其左子树有 j 个节点,右子树有 i - j - 1 个节点,根据组合数的性质,共有 C(i-1, j-1) 种选择 j 个节点作为左子树的方法。因此,dp[i] = sum(dp[j] * dp[i-j-1]),其中 j 从 1 到 i-1。
/*
* @lc app=leetcode.cn id=96 lang=javascript
*
* [96] 不同的二叉搜索树
*/
// @lc code=start
function numTrees(n) {
let dp = new Array(n + 1).fill(0);
dp[0] = 1;
dp[1] = 1;
for (let i = 2; i <= n; i++) {
for (let j = 1; j <= i; j++) {
dp[i] += dp[j - 1] * dp[i - j];
}
}
return dp[n];
}
// @lc code=end