js(99)~[95] 不同的二叉搜索树 II

161 阅读1分钟

力扣本题传送门

image.png

这道题,二叉树,只能想到可能要用递归,具体怎么用还是不知道,看了题解也不是太理解,但是按照题解注释应该能理解这写出来,不理解写是能写出来,就是很容易犯错,并且还不好找,不知道那是哪里错了,这个在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