这道题,二叉树,只能想到可能要用递归,具体怎么用还是不知道,看了题解也不是太理解,但是按照题解注释应该能理解这写出来,不理解写是能写出来,就是很容易犯错,并且还不好找,不知道那是哪里错了,这个在builTree(i+1, end),我这把end 写成start 好找
/*
* @lc app=leetcode.cn id=95 lang=javascript
*
* [95] 不同的二叉搜索树 II
*/
// @lc code=start
/**
* 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) {
function buildTree(start, end) {
// 定义返回的二叉树
// 指针交错递归终止
// 原来如此
// i指针滑动,枚举left和right分段的所有可
// 左侧和右侧生成树的集合 返回为数组
// 循环左右两侧的树集合 分别拼接到新树上,并且存储到结果数组中
// 从左子树集合中选出一棵左子树,从右子树集合中选出一棵右子树,拼接到根节点上
// left为空是这样的[null] 还是可以进来这个循环的 因为有这种场景你要想通 1==>2==>3 都是右子节点的情况
// 返回指定范围生成的树集合
const res = [];
//
if (start > end) {
return [null]
}
for (let i = start; i <= end; i++) {
const left = buildTree(start, i - 1);
// 后面是end
const right = buildTree(i + 1, end);
for (const ln of left) {
for (const rn of right) {
const node = new TreeNode(i);
node.left = ln;
node.right = rn;
res.push(node)
}
}
}
return res;
}
// n 为 0 是返回[]
if (n === 0) return []
// 指定最大范围
return buildTree(1, n)
}
// @lc code=end