线段树求区间和

代码

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;
        }
    }
}
发布了15 篇原创文章 · 获赞 1 · 访问量 697

猜你喜欢

转载自blog.csdn.net/max1231ff/article/details/104019721