不同的二叉搜索树 II:列举 1-n 能构造出的所有BST
#BST
思路类似于 96. 不同的二叉搜索树:1-n个数字能构造出多少个 BST
分解问题的思路:
- 1、穷举
root
节点的所有可能。 - 2、递归构造出左右子树的所有有效 BST → 是数组
- 3、给
root
节点穷举所有左右子树的组合。
var generateTrees = function (n) {
if (n === 0) return [];
return build(1, n);
function build(start, end) {
let res = [];
if (start > end) {
res.push(null);
return res;
}
for (let i = start; i <= end; i++) {
// 这两个都是数组
let leftTreeArr = build(start, i - 1);
let rightTreeArr = build(i + 1, end);
// 给 root 节点穷举所有左右子树的组合
for (let left of leftTreeArr) {
for (let right of rightTreeArr) {
let root = new TreeNode(i);
root.left = left;
root.right = right;
res.push(root);
}
}
}
return res;
}
};
目录
附:n
个节点能组成的所有 BST
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {number} n
* @return {TreeNode[]}
*/
var generateTrees = function (n) {
if (n === 0) {
return [];
}
return build(1, n);
};
/**
*@description 生成[lo,hi]区间的所有二叉搜索树
*@param {*} lo
*@param {*} hi
*/
function build(lo, hi) {
let res = [];
// 递归的出口,空节点
// lo > hi 代表空节点,即没有节点的二叉树
// 为什么是 null 而不是 [] ?
// 因为 null 代表空节点, [] 代表空数组, 代表有一个节点的二叉树
if (lo > hi) {
res.push(null);
return res;
}
// 穷举 root 节点的所有可能
for (let i = lo; i <= hi; i++) {
// 递归构造出左右子树的所有有效 BST=>递归构造左右子树
let left = build(lo, i - 1);
let right = build(i + 1, hi);
// 给 root 节点穷举所有左右子树的组合
for (let leftNode of left) {
for (let rightNode of right) {
let root = new TreeNode(i);
root.left = leftNode;
root.right = rightNode;
res.push(root);
}
}
}
return res;
}