095.不同的二叉搜索树II

题目

给定一个整数 n,生成所有由 1 … n 为节点所组成的 二叉搜索树 。

示例:

输入:3
输出:
[
  [1,null,3,2],
  [3,2,null,1],
  [3,1,null,null,2],
  [2,1,3],
  [1,null,2,null,3]
]
解释:
以上的输出对应以下 5 种不同结构的二叉搜索树:

   1         3     3      2      1
    \       /     /      / \      \
     3     2     1      1   3      2
    /     /       \                 \
   2     1         2                 3

提示:

  • 0 <= n <= 8

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/unique-binary-search-trees-ii 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

JS实现

1、回溯

/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {number} n
 * @return {TreeNode[]}
 */
var helper = function (start, end) {
  const allTrees = [];

  if (start > end) {
    return [null];
  }

  //枚举可行根节点
  for (let i = start; i <= end; i++) {
    //获得所有可行的左子树集合
    const leftTrees = helper(start, i - 1);
    //获得所有可行的右子树集合
    const rightTrees = helper(i + 1, end);

    //从左子树集合中选出一棵左子树,从右子树集合中选出一棵右子树,拼接到根节点上
    for (let left of leftTrees) {
      for (let right of rightTrees) {
        const currTree = new TreeNode(i);
        currTree.left = left;
        currTree.right = right;
        allTrees.push(currTree);
      }
    }
  }

  return allTrees;
};

var generateTrees = function (n) {
  if (n === 0) {
    return [];
  }
  return helper(1, n);
};