代码
public class LineTreeDemo {
//求区间和
private int L;
private int R;
private int rt;
private Node buildLineTree(int[] arr,int rt,Node[] dest,int L,int R){
if(L == R){
Node node = new Node();
node.setL(L);
node.setR(R);
node.setRt(rt);
node.setNum(arr[L]);
dest[rt] = node;
return node;
}
int md = (L+R) >>1;
int leftChild = rt<<1;
int rightChild = rt<<1|1;
Node nodeLeft = buildLineTree(arr,leftChild,dest,L,md);
Node nodeRight = buildLineTree(arr,rightChild,dest,md+1,R);
Node node = new Node();
node.setRt(rt);
node.setNum(nodeLeft.getNum()+nodeRight.getNum());
node.setL(L);
node.setR(R);
dest[rt] = node;
return node;
}
private int querySum(int L,int R,int rt,Node[] dest){
//System.out.println(rt);
Node node = dest[rt];
int left = node.getL();
int right = node.getR();
if(right == R && left ==L){
return node.getNum();
}else{
int mid = (left+right)>>1;
//左孩子的位置 2n
int lrt = rt<<1;
//右孩子的位置 2n+1
int rrt = rt<<1|1;
if(R<=mid){
return querySum(L,R,lrt,dest);
}else if(L>mid){
return querySum(L,R,rrt,dest);
}else{
return querySum(L,mid,lrt,dest)+querySum(mid+1,R,rrt,dest);
}
}
}
public static void main(String[] args) {
//给定一个区间,求区间和
int[] arr = {2,3,4,5,6,7,8,9,10};
//数组大小
Node[] dest = new Node[18];
//dest 0位置没有用
LineTreeDemo ss = new LineTreeDemo();
ss.buildLineTree(arr,1,dest,0,8);
//求0,0区间
//System.out.println(ss.querySum(0,0,1,dest));
//求0,1区间
// System.out.println(ss.querySum(0,1,1,dest));
//求0,1区间
//System.out.println(ss.querySum(0,2,1,dest));
//求0,1区间
System.out.println(ss.querySum(1,2,1,dest));
}
private class Node{
private int num;
private int L;
private int R;
private int rt;
public int getRt() {
return rt;
}
public void setRt(int rt) {
this.rt = rt;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public int getL() {
return L;
}
public void setL(int l) {
L = l;
}
public int getR() {
return R;
}
public void setR(int r) {
R = r;
}
}
}