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;
    }
};

你可能感兴趣的:(算法,数据结构,leetcode,c++,树)