不管全世界所有人怎么说,我都认为自己的感受才是正确的。无论别人怎么看,我绝不打乱自己的节奏。喜欢的事自然可以坚持,不喜欢的怎么也长久不了。
LeetCode:原题地址
题目要求
给你一个整数 n ,请你生成并返回所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同 二叉搜索树。可以按 任意顺序 返回答案
示例 1:
输入:n = 3
输出:[[1,null,2,null,3],[1,null,3,2],[2,1,3],[3,1,null,null,2],[3,2,null,1]]
示例 2:
输入: n = 1
输出: [[1]]
提示:
1 <= n <= 8
思路
- 穷举root节点的所有可能。
- 递归构造出左右子树的所有合法 BST。
- 给root节点穷举所有左右子树的组合。
var generateTrees = function (n) {
if (n == 0) return [];
// 备忘录,避免重复计算
let memo = new Map();
/* 构造闭区间 [lo, hi] 组成的 BST */
const build = (lo, hi) => {
let res = [];
// base case,显然当lo > hi闭区间[lo, hi]肯定是个空区间,也就对应着空节点 null,
if (lo > hi) {
res.push(null);
return res;
}
let memoKey = `${lo}&${hi}`;
// 如果缓存当中有就直接拿
if (memo.has(memoKey)) return memo.get(memoKey);
// 1、穷举 root 节点的所有可能。
for (let i = lo; i <= hi; i++) {
// 2、递归构造出左右子树的所有合法 BST。
let leftTree = build(lo, i - 1);
let rightTree = build(i + 1, hi);
// 3、给 root 节点穷举所有左右子树的组合。
for (let left of leftTree) {
for (let right of rightTree) {
res.push(new TreeNode(i, left, right));
}
}
}
// 将结果集放入到缓存中
memo.set(memoKey, res);
return res;
};
// 构造闭区间 [1, n] 组成的 BST
return build(1, n);
};