• 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
  • 相关阅读:
    Sentinel 规则持久化操作
    拼多多百亿补贴商品详情API接口系列
    前后端分离时后端shiro权限认证
    鱼传科技:函数计算,只要用上就会觉得香
    【系统设计】邻近服务
    Linux系统下安装RabbitMQ超简单教程(非详细)(Centos8)
    《异常检测——从经典算法到深度学习》27 可执行且可解释的在线服务系统中重复故障定位方法
    面试官:Redis如何实现持久化的、主从哨兵又是什么?
    wpf RelativeSource绑定
    深度学习笔记(4)——TextCNN、BiLSTM实现情感分类(weibo100k数据集)
  • 原文地址:https://blog.csdn.net/weixin_46841376/article/details/134414499