• LeetCode654. Maximum Binary Tree


    一、题目

    You are given an integer array nums with no duplicates. A maximum binary tree can be built recursively from nums using the following algorithm:

    Create a root node whose value is the maximum value in nums.
    Recursively build the left subtree on the subarray prefix to the left of the maximum value.
    Recursively build the right subtree on the subarray suffix to the right of the maximum value.
    Return the maximum binary tree built from nums.

    Example 1:

    Input: nums = [3,2,1,6,0,5]
    Output: [6,3,5,null,2,0,null,null,1]
    Explanation: The recursive calls are as follow:

    • The largest value in [3,2,1,6,0,5] is 6. Left prefix is [3,2,1] and right suffix is [0,5].
      • The largest value in [3,2,1] is 3. Left prefix is [] and right suffix is [2,1].
        • Empty array, so no child.
        • The largest value in [2,1] is 2. Left prefix is [] and right suffix is [1].
          • Empty array, so no child.
          • Only one element, so child is a node with value 1.
      • The largest value in [0,5] is 5. Left prefix is [0] and right suffix is [].
        • Only one element, so child is a node with value 0.
        • Empty array, so no child.
          Example 2:

    Input: nums = [3,2,1]
    Output: [3,null,2,null,1]

    Constraints:

    1 <= nums.length <= 1000
    0 <= nums[i] <= 1000
    All integers in nums are unique.

    二、题解

    本题思路类似105和106,都利用了切分数组+构建树的思路,本题只有一个数组,因此相比105和106题更简单。

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
     *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
     *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
     * };
     */
    class Solution {
    public:
        TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
            if(nums.size() == 0) return nullptr;
            int maxValue = *max_element(nums.begin(),nums.end());
            TreeNode* root = new TreeNode(maxValue);
            if(nums.size() == 1) return root;
            //切分左右数组
            vector<int> left;
            vector<int> right;
            int index = 0;
            for(int i = 0;i < nums.size();i++){
                if(nums[i] == maxValue){
                    index = i;
                    break;
                }
            }
            for(int i = 0;i < index;i++) left.push_back(nums[i]);
            for(int i = index + 1;i < nums.size();i++) right.push_back(nums[i]);
            root->left = constructMaximumBinaryTree(left);
            root->right = constructMaximumBinaryTree(right);
            return root;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
  • 相关阅读:
    开发一年不到,来面试居然敢开口要20K,面完连8K都不想给~
    【多线程】深入理解,单例模式:饿汉模式和懒汉模式(附常考面试题)
    ES6新增关键字:let和const及let的常用场景
    steam卡价越来越高,steam搬砖项目还能玩么?
    倾斜摄影测量和游戏的未来
    [ROS2系列] ubuntu 20.04测试rtabmap 3D建图(二)
    用LOL英雄图片点缀你的博客
    SaaS是什么?
    【Java 设计模式】创建者模式 之抽象工厂模式
    知虾shopee收费,多少钱一个月
  • 原文地址:https://blog.csdn.net/weixin_46841376/article/details/134414499