持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情
给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。
示例 1:
输入:n = 3输出:5
思路分析:
这道题需要我们知道n个节点时二叉搜索树有多少种,首先我们需要知道二叉搜索树的定义是什么。
二叉搜索树即每个根节点都大于左节点并小于右节点,并且左子树都小于根节点,右子树都大于子节点的树。
明白了二叉搜索树的定义后,我们题目要求知道n个节点时二叉搜索树的种数,我们已经知道了二叉搜索树是左子树小于根节点并小于右子树,那么对于每个节点,我们可以将它的左右数组分割出来分别作为左右子树,然后进行循环递归的方式来安排到每个子节点,并计算出左右子树的个数,然后进行相乘则得出结果,将n个的结果分别循环计算一遍相加则知道了最终的结果。
到这我们的整体思路也就大致清楚了,那么还有没有优化的空间呢,可以借用经典的动态规划思路来优化递归,我们将每次计算出来n个节点数时记录在备忘录中,在增加节点数时可以分解出来已经记录过的子树,在再次计算到n个节点的时候则可以直接使用以节省时间
var numTrees = function(n) {
let arr = []
let obj = {}
//递归左右子树
let deep = (child)=>{
if(obj[child.length])return obj[child.length]
if(child.length<=1)return 1
let total = 0
child.forEach((item,index)=>{
let left = deep(child.slice(0,index))
let right = deep(child.slice(index+1))
total += left*right
})
return total
}
for(let i = 1;i<=n;i++){
arr.push(i)
//记录不同节点个数时二叉树的种数
obj[i] = deep(arr)
}
return obj[n]
};