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

  1. 二叉树的根是数组 nums 中的最大元素。
  2. 左子树是通过数组中 最大值左边部分 递归构造出的最大二叉树。
  3. 右子树是通过数组中 最大值右边部分 递归构造出的最大二叉树。

返回有给定数组 nums 构建的 最大二叉树

示例 1:
654.最大二叉树 - 图1

  1. 输入:nums = [3,2,1,6,0,5]
  2. 输出:[6,3,5,null,2,0,null,null,1]
  3. 解释:递归调用如下所示:
  4. - [3,2,1,6,0,5] 中的最大值是 6 ,左边部分是 [3,2,1] ,右边部分是 [0,5]
  5. - [3,2,1] 中的最大值是 3 ,左边部分是 [] ,右边部分是 [2,1]
  6. - 空数组,无子节点。
  7. - [2,1] 中的最大值是 2 ,左边部分是 [] ,右边部分是 [1]
  8. - 空数组,无子节点。
  9. - 只有一个元素,所以子节点是一个值为 1 的节点。
  10. - [0,5] 中的最大值是 5 ,左边部分是 [0] ,右边部分是 []
  11. - 只有一个元素,所以子节点是一个值为 0 的节点。
  12. - 空数组,无子节点。

示例 2:
654.最大二叉树 - 图2

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


提示:

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

    解法一:递归

    记住 labuladong 的一句话:
    把题目的要求细化,搞清楚根节点应该做什么,然后剩下的事情抛给前/中/后序的遍历框架就行了,我们千万不要跳进递归的细节里,你的脑袋才能压几个栈呀。
    func constructMaximumBinaryTree(nums []int) *TreeNode {
      if len(nums) == 0 {
          return nil
      }
      idx, max := 0, math.MinInt32
      for i := 0; i < len(nums); i++ {
          if max < nums[i] {
              idx = i
              max = nums[i]
          }
      }
      head := new(TreeNode)
      head.Val = max
      head.Left = constructMaximumBinaryTree(nums[:idx])
      head.Right = constructMaximumBinaryTree(nums[idx+1:])
      return head
    }