1. 程式人生 > >[LeetCode] Maximum Binary Tree

[LeetCode] Maximum Binary Tree

數組為空 arr back eno 分割數組 class front sent out

Given an integer array with no duplicates. A maximum tree building on this array is defined as follow:

  1. The root is the maximum number in the array.
  2. The left subtree is the maximum tree constructed from left part subarray divided by the maximum number.
  3. The right subtree is the maximum tree constructed from right part subarray divided by the maximum number.

Construct the maximum tree by the given array and output the root node of this tree.

Example 1:

Input: [3,2,1,6,0,5]
Output: return the tree root node representing the following tree:

      6
    /      3     5
    \    / 
     2  0   
               1

Note:

  1. The size of the given array will be in the range [1,1000].

給定一個元素不重復的數組,構建一個由該數組組成的最大樹,這個最大樹要求如下:

1、根節點是數組中的最大數

2、左子樹的根節點由這個最大數分割數組的左邊部分的最大數組成。

3、右子樹的根節點由這個最大數分割數組的右邊部分的最大數組成。

構建這個樹並返回這個樹的根節點。

方法1:使用叠代的方法。

使用一個vector來模擬棧存儲數組節點。

如果當前數組為空,則將當前節點直接入棧

如果當前數組不為空,比較當前節點curNode與nodeVec->back()的val的大小。

1、如果當前數組非空並且當前節點值大於數組尾元素。則說明數組尾元素是當前節點的左子節點。此時彈出數組中元素。

2、如果當前元素非空,則說明當前節點為數組尾元素的右子節點。

將當前節點放入數組中。

最後返回數組中的頭元素。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
        vector<TreeNode*> nodeVec;
        for (int i = 0; i < nums.size(); i++) {
            TreeNode* curNode = new TreeNode(nums[i]);
            if (nodeVec.empty()) {
                nodeVec.push_back(curNode);
            }
            else {
                while (!nodeVec.empty() && nodeVec.back()->val < curNode->val) {
                    curNode->left = nodeVec.back();
                    nodeVec.pop_back();
                }
                if (!nodeVec.empty()) {
                    nodeVec.back()->right = curNode;
                }
                nodeVec.push_back(curNode);
            }
        }
        return nodeVec.front();
    }
};
// 65 ms

方法2:使用遞歸的方法

對於每一步

1、找出最大元素

2、根據最大元素將數組分為兩部分

3、將最大元素的左右節點叠代分配

返回根節點

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
        if (nums.empty())
            return nullptr;
        
        // use auto to declare iterator
        auto it = max_element(nums.begin(), nums.end());
        int maxVal = *it;
        
        // use auto to init with new; use nullptr instead of NULL
        auto* node = new TreeNode(maxVal);
        vector<int> left_nums(nums.begin(), it);
        vector<int> right_nums(it + 1, nums.end());
        node->left = constructMaximumBinaryTree(left_nums);
        node->right = constructMaximumBinaryTree(right_nums);
        
        return node;
    }
};
// 74 ms

[LeetCode] Maximum Binary Tree