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

浙公网安备 33010602011771号