Maximum Binary Tree Problem


Description

LeetCode Problem 654.

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:

1
2
3
4
5
6
7
8
9
10
11
12
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:

1
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.


Sample C++ Code

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
/**
 * 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) {
        return constructMaximumBinaryTree(nums, 0, nums.size() - 1);
    }
    
    TreeNode* constructMaximumBinaryTree(vector<int>& nums, int start, int end) {
        if (start > end) return nullptr;
        int index = -1;
        int val = -1;
        for (int i = start; i <= end; i++) {
            if (nums[i] > val) {
                index = i;
                val = nums[i];
            }
        }
        TreeNode* root = new TreeNode(val);
        root->left = constructMaximumBinaryTree(nums, start, index - 1);
        root->right = constructMaximumBinaryTree(nums, index+1, end);
        return root;
    }
};




Related Posts

Maximum Binary Tree Problem

LeetCode 654. You are given an integer array nums with...

Construct Quad Tree Problem

LeetCode 427. Given a n * n matrix grid of...

Binary Tree Preorder Traversal Problem

LeetCode 144. Given the root of a binary tree, return...

Binary Tree Postorder Traversal Problem

LeetCode 145. Given the root of abinary tree, return the...

Path Sum II Problem

LeetCode 113. Given the root of a binary tree and...