线段树学习建议视频:https://www.bilibili.com/video/av47331849
public class main {
//建线段树
public static void buildTree(int arr[],int tree[],int node,int start,int end){
if(start==end){
tree[node]=arr[start];
}
else{
int mid=(start+end)/2;
int left_node=2*node+1;
int right_node=2*node+2;
buildTree(arr,tree,left_node,start,mid);
buildTree(arr,tree,right_node,mid+1,end);
tree[node]=tree[left_node]+tree[right_node];
}
}
//单点更新
public static void update(int arr[],int tree[],int node,int start,int end,int idx,int val){
if(start==end){
arr[idx]=val;
tree[node]=val;
}
else{
int mid=(start+end)/2;
int left_node=2*node+1;
int right_node=2*node+2;
if(idx>=start&&idx<=mid){//和mid作比较,判断需要更改的节点位于mid的哪边
update(arr,tree,left_node,start,mid,idx,val);
}
else{
update(arr,tree,right_node,mid+1,end,idx,val);
}
tree[node]=tree[left_node]+tree[right_node];
}
}
//区间查询
public static int query(int arr[],int tree[],int node,int start,int end,int L,int R){
if(start>=L&&end<=R){
return tree[node];
}
int mid=(start+end)/2;
int left_node=2*node+1;
int right_node=2*node+2;
if(R<=mid) return query(arr,tree,left_node,start,mid,L,R);
else if(L>mid) return query(arr,tree,right_node,mid+1,end,L,R);
else return query(arr,tree,left_node,start,mid,L,R)+query(arr,tree,right_node,mid+1,end,L,R);
}
public static void main(String[] args) {
final int MAX_SIZE=100;
int arr[]={1,3,5,7,9,11};
int size=6;
int tree[]=new int[MAX_SIZE];
buildTree(arr,tree,0,0,size-1);
for(int i=0;i<15;i++){
System.out.print(tree[i]+" ");
}
System.out.println();
update(arr,tree,0,0,size-1,4,6);
for(int i=0;i<15;i++){
System.out.print(tree[i]+" ");
}
System.out.println();
int sum=query(arr,tree,0,0,size-1,2,5);
System.out.println(sum);
}
}