前言
前段时间自己去看了灾后重建这道题,里面需要用到,最小生成树,线段树等算法,所以今天去学习了线段树:
public class SegTree {
static int [] arr = {1,3,5,7,9,11};
static int size = arr.length;
static int [] tree = new int[(size+1)*2];
public static void build(int node,int start,int end) {
if(start == end) {
tree[node] = arr[start];
return;
}else {
int mid = (start + end) / 2;
int leftNode = 2 * node + 1;
int rightNode = 2 * node + 2;
build(leftNode,start,mid);
build(rightNode,mid+1,end);
tree[node] = tree[leftNode] + tree[rightNode];
}
}
public static int query(int node,int start,int end,int left,int right) {
if(right < start || left > end) {
return 0;
}else if(start == end) {
return tree[node];
}else {
int mid = (start+end)/2;
int leftNode = 2 * node + 1;
int rightNode = 2 * node + 2;
int sumLeft = query(leftNode,start,mid,left,right);
int sumRight = query(rightNode,mid+1,end,left,right);
return sumLeft + sumRight;
}
}
public static void update(int node,int left,int right,int index,int val) {
if(left == right) {
arr[index] = val;
tree[node] = val;
}else {
int mid = (left+right) / 2;
int leftNode = 2 * node + 1;
int rightNode = 2 * node + 2;
if(index >= left && index <= mid) {
update(leftNode,left,mid,index,val);
}else {
update(rightNode,mid+1,right,index,val);
tree[node] = tree[leftNode] + tree[rightNode];
}
}
}
public static void main(String[] args) {
//构建线段树
build(0,0,size-1);
//更新
update(0,0,size-1,4,6);
//查询区间和
System.out.println(query(0,0,size-1,2,5));
}
}
学习的视频是来自哔哩哔哩正月点灯笼这位up主的视频,这位up主讲得非常详细,非常推荐大家去看。