[路飞]_不同的二叉搜索树 II

228 阅读1分钟

95. 不同的二叉搜索树 II

题目

给你一个整数 n ,请你生成并返回所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同 二叉搜索树 **。可以按 任意顺序 返回答案。

示例1

image.png

输入:n = 3
输出:[[1,null,2,null,3],[1,null,3,2],[2,1,3],[3,1,null,null,2],[3,2,null,1]]

题解

递归

  • 递归构建从[1,n]的二叉树
  • 二叉树,所以对任意节点i位置二叉树将[1,n]分为两部分,left部分从[1,left-1] right部分从[right+1,n]
  • 划分比较清楚,开始写代码

代码如下,注释很清晰:

代码

var generateTrees = function (n) {
  if (n === 0) return []
  return helper(1, n)
  function helper(start, end) {
    const path = []
    if (start > end) return [null]
    //1、 对任意i
    for (let i = start; i <= end; i++) {
      // 2、 构建i节点左侧树
      const leftChild = helper(start, i - 1)
      // 3、 构建i节点右侧树
      const rightChilde = helper(i + 1, end)
      // 4、 枚举左侧树,具体看7、这里得到的树数组,数组中方的树TreeNode节点
      for (let left of leftChild) {
        // 5、 枚举右侧树,
        for (let right of rightChilde) {
          // 6、 构建i节点,并将左右节点挂载在i节点
          const root = new TreeNode(i)
          root.left = left
          root.right = right
          path.push(root)
        }
      }
    }
    // 7、 返回数组

    return path
  }
}

结语

理解三句话,不解想半天;还是太菜