一、题目内容 中等

给定一个不重复的整数数组 nums最大二叉树 可以用下面的算法从 nums 递归地构建:

创建一个根节点,其值为 nums 中的最大值。
递归地在最大值 左边 的 子数组前缀上 构建左子树。
递归地在最大值 右边 的 子数组后缀上 构建右子树。
返回 nums 构建的 最大二叉树 。

示例1:

输入: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 的节点。
      • 空数组,无子节点。

12. 最大二叉树(654) - 图1

示例2:

12. 最大二叉树(654) - 图2 输入:nums = [3,2,1] 输出:[3,null,2,null,1]

提示:

  • 1 <= nums.length <= 1000
  • 0 <= nums[i] <= 1000
  • nums 中的所有整数 互不相同

二、解题思路

最大二叉树的构建过程如下:
12. 最大二叉树(654) - 图3
构造树一般采用的是前序遍历,因为先构造中间节点,然后递归构造左子树和右子树。

三、具体代码

  1. /**
  2. * @param {number[]} nums
  3. * @return {TreeNode}
  4. */
  5. var constructMaximumBinaryTree = function (nums) {
  6. const buildTree = (arr, left, right) => {
  7. if (left > right) return null
  8. let maxNum = -1, maxIndex = -1
  9. for (let i = left; i <= right; i++) {
  10. if (maxNum < arr[i]) {
  11. maxNum = arr[i]
  12. maxIndex = i
  13. }
  14. }
  15. const node = new TreeNode(maxNum)
  16. node.left = buildTree(arr, left, maxIndex - 1)
  17. node.right = buildTree(arr, maxIndex + 1, right)
  18. return node
  19. }
  20. return buildTree(nums, 0, nums.length - 1)
  21. };

四、其他解法