segment tree实现
简单的dfs,arr是原数组,tree是用一维数组存树的。树的节点用node来检查
#include<iostream> using namespace std; //node是树的结点 void build_tree(int arr[],int tree[],int node,int start,int end){ if(start==end){ tree[node]=arr[end]; } else{ int mid=(start+end)/2; int left_node=2*node+1; int right_node=2*node+2; build_tree(arr,tree,left_node,start,mid); build_tree(arr,tree,right_node,mid+1,end); tree[node]=tree[left_node]+tree[right_node]; } } void update_tree(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){ update_tree(arr,tree,left_node,start,mid,idx,val); } else{ update_tree(arr,tree,right_node,mid+1,end,idx,val); } tree[node]=tree[left_node]+tree[right_node]; } } int query_tree(int arr[],int tree[],int node,int start,int end,int L,int R){ if(R<start || L> end){ return 0; } else if(start==end){ return tree[node]; } else{ int mid=(start+end)/2; int left_node=2*node+1; int right_node=2*node+2; int sum_left=query_tree(arr,tree,left_node,start,mid,L,R); int sum_right=query_tree(arr,tree,right_node,mid+1,end,L,R); return sum_left+sum_right; } } int main(){ int arr[]={1,3,5,7,9,11}; int size=6; int tree[100]={0}; build_tree(arr,tree,0,0,size-1); for(int i=0;i<6;i++) cout<<"arr"<<i<<"="<<arr[i]<<endl; for(int i=0;i<15;i++) cout<<"tree["<<i<<"]="<<tree[i]<<endl; update_tree(arr,tree,0,0,size-1,4,6); cout<<"更新节点"<<endl; for(int i=0;i<6;i++) cout<<"arr"<<i<<"="<<arr[i]<<endl; for(int i=0;i<15;i++) cout<<"tree["<<i<<"]="<<tree[i]<<endl; int a=query_tree(arr,tree,0,0,size-1,2,5); cout<<"2到5相加的值为: "<<a<<endl; return 0; }

浙公网安备 33010602011771号