不同的二叉搜索树
题目详情
给定一个整数 n,求以1 ... n
为节点组成的二叉搜索树有多少种?
解题思路
以dp[3]
为例,
dp[3]
,就是 元素1
为头结点搜索树的数量 + 元素2
为头结点搜索树的数量 + 元素3
为头结点搜索树的数量
元素1
为头结点搜索树的数量 = 右子树有 2 个元素的搜索树数量 * 左子树有 0 个元素的搜索树数量
元素2
为头结点搜索树的数量 = 右子树有 1 个元素的搜索树数量 * 左子树有 1 个元素的搜索树数量
元素3
为头结点搜索树的数量 = 右子树有 0 个元素的搜索树数量 * 左子树有 2 个元素的搜索树数量
有2
个元素的搜索树数量就是dp[2]
。
有1
个元素的搜索树数量就是dp[1]
。
有0
个元素的搜索树数量就是dp[0]
。
所以 dp[3] = dp[2] _ dp[0] + dp[1] _ dp[1] + dp[0] * dp[2]
代码实现
js
var numTrees = function (n) {
let dp = new Array(n + 1).fill(0);
dp[0] = 1;
for (let i = 1; i <= n; i++) {
for (let j = 1; j <= i; j++) {
dp[i] += dp[j - 1] * dp[i - j];
}
}
return dp[n];
};