654. Maximum Binary Tree

方法一:

树的问题,第一想法就是递归。用start和end来确定数组区间,[start,end)。

这里又用到了 STL 的 max_element。主要运用如下:

max_pos = max_element(v.begin(),v.end()) - v.begin();

max_num = *max_element(v.begin(),v.end());

class Solution {
public:
    TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
        return constructTree(nums,0,nums.size());
    }
    
    TreeNode *constructTree(vector<int> &nums, int start, int end){ //[start,end)
        if (!(0<=start && start<end && end<=nums.size())) return NULL;
        int max_i=max_element(nums.begin()+start,nums.begin()+end)-nums.begin();
        cout << nums[max_i] << endl;
        TreeNode *root=new TreeNode(nums[max_i]);
        root->left = constructTree(nums,start,max_i);
        root->right= constructTree(nums,max_i+1,end);
        return root;
    }
};

 

方法二:

本道题构造的树叫做 “Cartesian Tree”, https://en.wikipedia.org/wiki/Cartesian_tree, 利用栈等数据结构,可以在O(n)时间构造。由于这个方法比较tricky,稍微记一下就好。

class Solution {
public:
    TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
        vector<TreeNode*> v;
        for (int num : nums) {
            TreeNode *cur=new TreeNode(num);
            while (!v.empty() && v.back()->val < num) {
                cur->left = v.back();
                v.pop_back();
            }
            if (!v.empty()) {
                v.back()->right = cur;
            }
            v.push_back(cur);
        }
        return v.front();
    }
};

 

posted @ 2018-06-06 15:56  約束の空  阅读(102)  评论(0)    收藏  举报