The structure of Segment Tree is a binary tree which each node has two attributes start
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)
一开始觉的跟第一题不大一样,因为多了一个max元素,仔细一想其实是一样的。在构建这个树的过程中,需要先构建一个节点的子节点,所以子节点的max值是可以找到的,然后当前节点的最大值就由左右孩子的max值决定就好了。
代码:
public SegmentTreeNode build(int[] A) {
// write your code here
if(A == null || A.length == 0) return null;
return build(A, 0, A.length-1);
}
private SegmentTreeNode build(int [] A, int low, int high){
if(low > high) return null;
if(low == high){
SegmentTreeNode node = new SegmentTreeNode(low, high);
node.max = A[low];
return node;
}
int mid = (low + high)/2;
SegmentTreeNode left = build(A, low, mid);
SegmentTreeNode right = build(A, mid+1, high);
SegmentTreeNode node = new SegmentTreeNode(low, high);
node.left = left;
node.right = right;
node.max = Math.max(left.max, right.max);
return node;
}