• 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
  • 相关阅读:
    VAE, the principle and the code
    YOLOv6又快又准的目标检测框架 已开源
    反欺诈模型常用开发工具
    AtCoder Beginner Contest 278 G.Generalized Subtraction Game(思维题/博弈 multi-sg)
    C# 正确实现IDisposable 释放非托管资源
    协议-TCP协议-基础概念03-Keep live保活机制-TCP RST-TCP连接
    低功耗、高性能处理器RK3326、RK3308、RK2206、RK2108芯片可广泛应用于各种产品领域。
    leetcode做题笔记133. 克隆图
    【限定词习题】a little / a few / less / fewer
    Okhttps解决异步解析非Json数据异常问题
  • 原文地址:https://blog.csdn.net/weixin_46841376/article/details/134414499