线段树的实现(代码实现)

线段树的实现(代码实现)

我们先给出线段树结点类:

/**
 * 线段树的结点类
 */
class Node{
    //start和end用于确定区间, sum用于存储区间所有结点的和
    int start, end, sum;

    //定义左右指针
    Node left, right;

    //提供有参构造, 有参构造中要有两个参数int start, int end , 后面我们在创建线段树的方法中要使用
    public Node(int start, int end){
        this.start = start;
        this.end = end;
    }
}

然后我们给出线段树类:

/**
 * 线段树类
 */
public class SegmentTree {
    //定义属性int [] nums 和 root
    int [] nums;
    Node root; //根节点

    //给出有参构造, 用于初始化成员变量, 要初始化root就是在构造方法中调用创建线段树的方法, 调用该方法创建线段树之后返回创建的线段树的根节点之后赋值给root结点
    public SegmentTree(int [] nums){
        this. nums = nums;
        this.root = buildTree(nums, 0, nums.length - 1);
    }

    private Node buildTree(int[] nums, int start, int end) {
        if(start > end) return null;

        Node node = new Node(start,end);
        if(start == end) node.sum = nums[start];
        else{
            int mid = start + (end - start) / 2;
            node.left = buildTree(nums,start,mid);
            node.right = buildTree(nums,mid + 1,end);

            //回溯的时候要对父节点sum进行一个赋值
            node.sum = node.left.sum + node.right.sum;
        }
        return node;
    }

    //区间求和的方法
    public int sumRange(Node node, int start, int end){
        if(start > end) return 0;
        if(node.start == start && node.end == end) return node.sum;

        int mid = node.start + (node.end - node.start) / 2;
        if(end <= mid) return sumRange(node.left, start, end);
        else if(start > mid) return sumRange(node.right, start, end);
        else return sumRange(node.left, start, mid) + sumRange(node.right, mid + 1, end);
    }
}

你可能感兴趣的:(算法与数据结构,算法,数据结构,java)