leetcode--654. Maximum Binary Tree

参考:https://leetcode.com/problems/maximum-binary-tree/discuss/106147/C%2B%2B-8-lines-O(n-log-n)-map-plus-stack-with-binary-search

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<TreeNode*>root,模拟栈。用来存放遍历的当前数字。

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) {
        vector<TreeNode*>root;
        for(int i=0;i<nums.size();i++)
        {
        TreeNode* add=new TreeNode(nums[i]);
            if(root.empty())
                root.push_back(add);
            else
            {
                while(!root.empty()&&root.back()->val<nums[i])
                {
                    add->left=root.back();
                    root.pop_back();
                }
                if(!root.empty())
                    root.back()->right=add;
                root.push_back(add);
            }
        }
        return root.front();
    }
};

运行结果:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值