题目描述:
The structure of Segment Tree is a binary tree which each node has two attributesstart
and end
denote an segment / interval.
start and end are both integers, they should be assigned in following rules:
- The root's start and end is given by
build
method. - The left child of node A has
start=A.left, end=(A.left + A.right) / 2
. - The right child of node A has
start=(A.left + A.right) / 2 + 1, end=A.right
. - if start equals to end, there will be no children for this node.
Implement a build
method with a given array, so that we can create a corresponding segment tree with every node value represent the corresponding interval max value in the array, return the root of this segment tree.
Segment Tree (a.k.a Interval Tree) is an advanced data structure which can support queries like:
- which of these intervals contain a given point
- which of these points are in a given interval
See wiki:
Segment Tree
Interval Tree
Given [3,2,1,4]
. The segment tree will be:
[0, 3] (max = 4)
/ \
[0, 1] (max = 3) [2, 3] (max = 4)
/ \ / \
[0, 0](max = 3) [1, 1](max = 2)[2, 2](max = 1) [3, 3] (max = 4)
这题先从最下面的子树找起,start==end的时候,max就是A[start]。找完子树的max就可以得到root的max了。还是用recursion就行。
Mycode(AC = 86ms):
/**
* Definition of SegmentTreeNode:
* class SegmentTreeNode {
* public:
* int start, end, max;
* SegmentTreeNode *left, *right;
* SegmentTreeNode(int start, int end, int max) {
* this->start = start;
* this->end = end;
* this->max = max;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
public:
/**
*@param A: a list of integer
*@return: The root of Segment Tree
*/
SegmentTreeNode * build(vector<int>& A) {
// write your code here
return buildTree(A, 0, A.size() - 1);
}
SegmentTreeNode* buildTree(vector<int>& A, int start, int end) {
if (start > end) {
return NULL;
}
else if (start == end) {
return new SegmentTreeNode(start, end, A[start]);
}
else {
SegmentTreeNode *root = new SegmentTreeNode(start, end, A[start]);
root->left = buildTree(A, start, (start + end) / 2);
root->right = buildTree(A, (start + end) / 2 + 1, end);
int max_val = INT_MIN;
if (root->left) max_val = max(max_val, root->left->max);
if (root->right) max_val = max(max_val, root->right->max);
root->max = max_val;
return root;
}
}
};