JavaScript / TypeScript for LeetCode (八十五)

是差点运气,可我一直在努力!

当前进程:

  • 开始时间:2020.6.27
  • 结束时间:undefined

GitHub仓库:https://github.com/Cundefined/JavaScript-or-TypeScript-for-LeetCode

1、题目要求

( LeetCode-第95题 ) 不同的二叉搜索树 II

2、解题思路

方法:递归

二叉搜索树特点:
1、空树也是二叉搜索树
2、左子树所有节点值 < 当前节点值 < 右子树所有节点值

2.1、JavaScript Solution

/**
 * 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 generate(start, end) {
    const res = [];
    // 递归结束条件
    if (start > end) {
      res.push(null);
      return res;
    }
    // start到end,依次选择数字作为根结点,
    for (let root = start; root <= end; root++) {
      // 生成当前根节点的左右子树列表(数组)
      let leftSubTree = generate(start, root - 1);
      let rightSubTree = generate(root + 1, end);

      // 全排列
      // 左子树可能的排列数 * 右子树可能的排列数 = 完整树的可能排列数
      for (const l of leftSubTree) {
        // 固定左子树,遍历右子树
        for (const r of rightSubTree) {
          // 开始生成节点
          let currNode = new TreeNode(root);
          currNode.left = l;
          currNode.right = r;
          // 生成一个节点,就保存一个
          res.push(currNode);
        }
      }
    }

    return res;
  }

  if (n === 0) {
    return [];
  }

  return generate(1, n);
};

2.2、TypeScript Solution

/**
 * Definition for a binary tree node.
 * class TreeNode {
 *     val: number
 *     left: TreeNode | null
 *     right: TreeNode | null
 *     constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
 *         this.val = (val===undefined ? 0 : val)
 *         this.left = (left===undefined ? null : left)
 *         this.right = (right===undefined ? null : right)
 *     }
 * }
 */

function generateTrees(n: number): Array<TreeNode | null> {
  function generate(start: number, end: number): Array<TreeNode | null> {
    const res: Array<TreeNode | null> = [];

    if (start > end) {
      res.push(null);
      return res;
    }

    for (let root: number = start; root <= end; root++) {
      let leftSubTree: Array<TreeNode | null> = generate(start, root - 1);
      let rightSubTree: Array<TreeNode | null> = generate(root + 1, end);

      for (const l of leftSubTree) {
        for (const r of rightSubTree) {
          let currNode: TreeNode = new TreeNode(root);
          currNode.left = l;
          currNode.right = r;

          res.push(currNode);
        }
      }
    }

    return res;
  }

  if (n === 0) {
    return [];
  }

  return generate(1, n);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值