给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。
示例1:
输入:n = 3
输出:5
示例 2:
输入:n = 1
输出:1
提示: 1 <= n <= 19
二叉搜索树定义:(又名:二叉查找树,有序二叉树,排序二叉树)
动态规划,原问题可以分解为规模较小的子问题,子问题的解可以重用解决方案。
分析: 给了一个从 1 到 n 的数组,为了得到可以构建几颗二叉搜索树,可以遍历从 1 到 n 每个元素,分别将每个元素作为根节点,将 1 至 (i - 1) 的元素作为左子树,将 (i + 1) 至 n 的元素作为右子树。
根据上面的思路,给定一个从 1 到 n 的数组,要得到能构建的所有二叉搜索树的总数, 那就遍历该数组,分别让每个元素都作为根节点,分别求出所有的数量,最后相加即为结果。
假设有两个函数:
所以可以得到:
边界情况:
const numTrees = (n) => {
const arr = new Array(n + 1).fill(0);
arr[0] = 1;
arr[1] = 1;
for (let i = 2; i <= n; i++) {
for (let j = 1; j <= i; j++) {
arr[i] = arr[i] + arr[j - 1] * arr[i - j]
}
}
return arr[n]
}