Unique Binary Search Trees II

174 阅读1分钟

题目描述

leetcode.com/problems/un…

分析

题目要求生成所有的值为从 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
}