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;
}

 

posted @ 2021-05-14 15:45  奕玑  阅读(60)  评论(0)    收藏  举报