您的位置:首页 > 编程语言 > Java开发

一个用JAVA实现的线段树类--泛型 重构.

2014-11-16 19:23 363 查看
抽象类SegmentOperation.java:

public abstract class SegmentOperation<T> {
public abstract T getMid(T o1, T o2);
public abstract T getNext(T o1);
public abstract int compare(T o1, T o2);
}


线段树实现SegmentTree.java:

public class SegmentTree<T> {

private SegmentTree<T> treeRight;
private SegmentTree<T> treeLeft;
private boolean isLeaf;

private T begin;
private T end;
private int value;

SegmentOperation<T> oper;

public SegmentTree(T beginT, T endT, int segmentValue, SegmentOperation<T> operT) {
begin = beginT;
end = endT;
value = segmentValue;
oper = operT;
treeRight = null;
treeLeft = null;
isLeaf = true;
}

private void update(int segmentValue) {
value = segmentValue;
if ( treeLeft != null ) {
treeLeft.update(segmentValue);
}
if ( treeRight != null ) {
treeRight.update(segmentValue);
}
}

public void insert(T beginT, T endT, int segmentValue) {
if ( (oper.compare(begin, beginT) == 0) && (oper.compare(end, endT) == 0 ) ) {
update(segmentValue);
return;
}

if ( oper.compare(beginT, endT) == 0 ) {
return;
}
T mid = oper.getMid(begin, end);
T midNext = oper.getNext(mid);
if ( isLeaf ) {
treeLeft = new SegmentTree<T>(begin, mid, value, oper);
treeRight = new SegmentTree<T>(midNext, end, value, oper);
isLeaf = false;
}
if ( oper.compare(mid, endT) >= 0 ) {
treeLeft.insert(beginT, endT, segmentValue);
}
else if ( oper.compare(midNext, beginT) <= 0 ) {
treeRight.insert(beginT, endT, segmentValue);
}
else {
treeLeft.insert(beginT, mid, segmentValue);
treeRight.insert(midNext, endT, segmentValue);
}
}
}


代码中没有对Query Delete等方法进行实现,需要的话可以根据实际情况对其进行编写。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: