LeetCode654.最大二叉树

304 阅读2分钟

「这是我参与11月更文挑战的第8天,活动详情查看:2021最后一次更文挑战

最大二叉树

给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下:

  • 二叉树的根是数组中的最大元素。
  • 左子树是通过数组中最大值左边部分构造出的最大二叉树。
  • 右子树是通过数组中最大值右边部分构造出的最大二叉树。

通过给定的数组构建最大二叉树,并且输出这个树的根节点。

image.png 输入:nums = [3,2,1,6,0,5] 输出:[6,3,5,null,2,0,null,null,1] 解释:递归调用如下所示:

  • [3,2,1,6,0,5] 中的最大值是 6 ,左边部分是 [3,2,1] ,右边部分是 [0,5] 。
    • [3,2,1] 中的最大值是 3 ,左边部分是 [] ,右边部分是 [2,1] 。
      • 空数组,无子节点。
      • [2,1] 中的最大值是 2 ,左边部分是 [] ,右边部分是 [1] 。
        • 空数组,无子节点。
        • 只有一个元素,所以子节点是一个值为 1 的节点。
    • [0,5] 中的最大值是 5 ,左边部分是 [0] ,右边部分是 [] 。
      • 只有一个元素,所以子节点是一个值为 0 的节点。
      • 空数组,无子节点。

image.png

image.png

解法

我们可以通过递归来解决这道题

  1. 递归的操作:首先我们先获取当前数组的最大值索引,以此得到最大值来构建这层的根节点,并通过索引来将数组分割为左右两个数组,这两个数组分别对应了该根节点左右两个子树的val值集合,递归得到当前根节点的左子节点和右子节点
  2. 递归的返回值:返回当前层构建的根节点,供其父节点做left和right连接
  3. 递归的终止条件:当传入的构建数组长度为0时,证明已经递归结束

代码如下:

var constructMaximumBinaryTree = function(nums) {
    const constructSubMaximumBinaryTree = function(nums) {
        if(nums.length === 0) return null;
        let maxIndex = nums.indexOf(Math.max(...nums));
        let rootNode = new TreeNode(nums[maxIndex]);
        let leftNums = nums.slice(0,maxIndex);
        let rightNums = nums.slice(maxIndex + 1)
        rootNode.left = constructSubMaximumBinaryTree(leftNums);
        rootNode.right = constructSubMaximumBinaryTree(rightNums);
        return rootNode;
    }
    if(nums.length === 0) return null;
    let root = constructSubMaximumBinaryTree(nums);
    return root;
};