Maximum Binary Tree Posted on 2018-10-26 Descriptionhttps://leetcode.com/problems/maximum-binary-tree/description/ Solution123456789101112131415161718192021222324252627282930313233/** * 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) { TreeNode* ret = NULL; helper(nums, ret, 0, nums.size() - 1); return ret; } void helper(vector<int>& nums, TreeNode*& ret, int start, int end) { if (start > end) return; int maxium = INT_MIN; int target = -1; for (int i = start; i <= end; ++i) { if (nums[i] > maxium) { maxium = max(nums[i], maxium); target = i; } } ret = new TreeNode(maxium); helper(nums, ret->left, start, target - 1); helper(nums, ret->right, target + 1, end); }}; Segment Tree123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */struct SegNode{ int leftBound; int rightBound; pair<int, int> maxium;};class Solution {public: TreeNode* constructMaximumBinaryTree(vector<int>& nums) { TreeNode* ret = NULL; if (nums.size() == 0) return ret; vector<SegNode> seg(nums.size() * 4); build(seg, nums, 0, nums.size() - 1, 0); helper(nums, ret, 0, nums.size() - 1, seg); return ret; } pair<int, int> build(vector<SegNode>& seg, vector<int>& nums, int start, int end, int index) { if (start > end) return make_pair(INT_MIN, -1); seg[index].leftBound = start; seg[index].rightBound = end; if (start == end) { seg[index].maxium = make_pair(nums[start], start); return seg[index].maxium; } int mid = (start + end) >> 1; auto l = build(seg, nums, start, mid, index * 2 + 1); auto r = build(seg, nums, mid + 1, end, index * 2 + 2); seg[index].maxium = l.first > r.first ? l : r; return seg[index].maxium; } pair<int, int> query(int left, int right, vector<SegNode>& seg, int index) { if (left > right) return make_pair(INT_MIN, -1); int leftBound = seg[index].leftBound; int rightBound = seg[index].rightBound; int mid = (leftBound + rightBound) >> 1; if (left == leftBound && right == rightBound) return seg[index].maxium; if (left > mid) return query(left, right, seg, index * 2 + 2); if (right <= mid) return query(left, right, seg, index * 2 + 1); auto l = query(left, mid, seg, index * 2 + 1); auto r = query(mid + 1, right, seg, index * 2 + 2); return l.first > r.first ? l : r; } void helper(vector<int>& nums, TreeNode*& ret, int start, int end, vector<SegNode>& seg) { if (start > end) return; auto target = query(start, end, seg, 0); ret = new TreeNode(target.first); ret->left = NULL; ret->right = NULL; helper(nums, ret->left, start, target.second - 1, seg); helper(nums, ret->right, target.second + 1, end, seg); }};