Skip to content

Commit

Permalink
SegmentTree query().
Browse files Browse the repository at this point in the history
  • Loading branch information
liusishan committed Feb 27, 2019
1 parent 26310dc commit f50176f
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 2 deletions.
7 changes: 5 additions & 2 deletions 09-Segment-Tree/01-Segment-Tree-Basics/src/Main.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,16 @@
public class Main {
public static void main(String[] args) {

Integer[] nums = {-2, 0, 3, -5, 2 - 1};
Integer[] nums = {-2, 0, 3, -5, 2, - 1};
SegmentTree<Integer> segmentTree = new SegmentTree<>(nums, new Merger<Integer>() {
@Override
public Integer merge(Integer a, Integer b) {
return a + b;
}
});
System.out.println(segmentTree);
// System.out.println(segmentTree);
System.out.println(segmentTree.query(0, 2));
System.out.println(segmentTree.query(2, 5));
System.out.println(segmentTree.query(0, 5));
}
}
32 changes: 32 additions & 0 deletions 09-Segment-Tree/01-Segment-Tree-Basics/src/SegmentTree.java
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import javax.xml.transform.Result;

/**
* @Auther: lss
* @Date: 2019/2/26 20:53
Expand Down Expand Up @@ -60,6 +62,36 @@ private int rightChild(int index) {
return 2 * index + 2;
}

// 返回区间[queryL,queryR]的值
public E query(int queryL, int queryR) {

if (queryL < 0 || queryL >= data.length ||
queryR < 0 || queryR >= data.length || queryL > queryR)
throw new IllegalArgumentException("Index is illegal.");

return query(0, 0, data.length - 1, queryL, queryR);
}

// 在以treeId为根的线段树中[l...r]的范围里,搜索区间[queryL...queryR]的值
private E query(int treeIndex, int l, int r, int queryL, int queryR) {

if (l == queryL && r == queryR)
return tree[treeIndex];

int mid = l + (r - l) / 2;
int leftTreeIndex = leftChild(treeIndex);
int rightTreeIndex = rightChild(treeIndex);

if (queryL >= mid + 1)
return query(rightTreeIndex, mid + 1, r, queryL, queryR);
else if (queryR <= mid)
return query(leftTreeIndex, l, mid, queryL, queryR);

E leftResult = query(leftTreeIndex, l, mid, queryL, mid);
E rightResult = query(rightTreeIndex, mid + 1, r, mid + 1, queryR);
return merger.merge(leftResult, rightResult);
}

@Override
public String toString() {
StringBuilder res = new StringBuilder();
Expand Down

0 comments on commit f50176f

Please sign in to comment.