最大二叉树

原题:

给定一个不含重复元素的整数数组 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 中的所有整数 互不相同

解题方法:

解法一:

class Solution {
public:
    unordered_map<int,int> Index;
    TreeNode* constructMaximumBinaryTree(vector<int>& nums) {   
        int n=nums.size();
        for(int i=0;i<n;i++)
            Index[nums[i]]=i;
        return MyBuildTree(nums,0,n-1);
    }

    TreeNode* MyBuildTree(const vector<int>& nums,int in_left,int in_right)
    {
        if(in_left>in_right)
            return nullptr;
        int maxval=INT_MIN;
        for(int i=in_left;i<=in_right;i++)
        {
            maxval=max(maxval,nums[i]);
        }
        int in_left_size=Index[maxval];
        auto root=new TreeNode(maxval);
        root->left=MyBuildTree(nums,in_left,in_left_size-1);
        root->right=MyBuildTree(nums,in_left_size+1,in_right);
        return root;
    }
};

做题小结:

这道题做的时候很蠢,导致卡了很久,蠢就蠢在一直想把nums排序然后当成前序数组来照搬前序和中序建树的代码。但是完全忽略了,这道题的最值应该在每一部分去找最值,而不是挨着挪用全局的最值!