题目描述
分析
题目要求生成所有的值为从 1 - n 的节点的所有树
解题思路
很明显,我们需要要用构建左树和右树然后放到 root 下边的方法来实现题目
算法
递归
通过递归来构建树
过程
构建出所有的根节点,然后通过递归的方法,拿到所有左树的情况以及所有右树的情况,在依次连到 root
遍历 1 - n
每个值是此次遍历的 root.val,用这个值生成 root
构建所有左树和右树
对于所有的情况,都要考虑到,因此需要使用递归再次对所有小于和大于 root.val 的值递归下去构建树🌲
对于当前 root,通过双层 for,组合成不同的树
代码
/**
* 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 go(1, n)
}
function go(l, r) {
if (l > r) return [null]
if (l === r) return [new TreeNode(l)]
const ans = []
for (let i = l; i <= r; i++) {
const left = go(l, i - 1)
const right = go(i + 1, r)
for (const node1 of left) {
for (const node2 of right) {
const root = new TreeNode(i)
root.left = node1
root.right = node2
ans.push(root)
}
}
}
return ans
}