Fork me on GitHub

Maximum Binary Tree

Description

https://leetcode.com/problems/maximum-binary-tree/description/

Solution

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/**
* 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 Tree

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
/**
* 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);
}
};