设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 手机 数据 公司
当前位置: 首页 > 服务器 > 安全 > 正文

【数据结构】线段树(Segment Tree)(2)

发布时间:2021-04-01 04:32 所属栏目:53 来源:网络整理
导读:void update(int a[],int node,int end,int x,int val){ //找到a[x],修改值 if (start == end){ a[x] = val; tree[node] = val; } else { int mid = (start + end) / 2; int left = 2 * node + 1; int right = 2 *

【数据结构】线段树(Segment Tree)

void update(int a[],int node,int end,int x,int val){ //找到a[x],修改值 
    if (start == end){ a[x] = val; tree[node] = val; } else { int mid = (start + end) / 2; int left  = 2 * node + 1; int right = 2 * node + 2; if (x >= start && x <= mid) {//如果x在左分支 
 update(a,mid,x,val); } else {//如果x在右分支 
            update(a,end,val); } //向上更新值 
        tree[node] = tree[left] + tree[right]; } } 在主函数中调用: //把a[x]改成6
update(a,size-1,4,6);

?

运行结果:

【数据结构】线段树(Segment Tree)

query操作:

  • 向下依次寻找包含在目标区间中的区间,并累加。
  • 与建树的函数相比,query函数增加了两个参数L,Rl,即把求a的区间[L,R]的和。

例:求a[2]+a[3]+...+a[5]的值(代码实现)

【数据结构】线段树(Segment Tree)

int query(int a[],int L,int R){ //若目标区间与当时区间没有重叠,结束递归返回0 
    if (start > R || end < L){ return 0; } //若目标区间包含当时区间,直接返回节点值 
    else if (L <=start && end <= R){ return tree[node]; } else { int mid = (start + end) / 2; int left  = 2 * node + 1; int right = 2 * node + 2; //计算左边区间的值 
        int sum_left  = query(a,L,R); //计算右边区间的值 
        int sum_right = query(a,R); //相加即为答案 
        return sum_left + sum_right; } } 在主函数中调用: //求区间[2,5]的和
int ans = query(a,2,5); printf("ans = %d",ans); 

运行结果:

【数据结构】线段树(Segment Tree)

最后,献上完整的代码:

#include<bits/stdc++.h>
using namespace std; const int N = 1000; int a[] = {1,int end){ //递归边界(即遇到叶子节点时) 
    if (start == end) { //直接存储a数组中的值 
        tree[node] = a[start]; } else { //将建立的区间分成两半 
        int mid = (start + end) / 2; int left  = 2 * node + 1;//左子节点的下标 
        int right = 2 * node + 2;//右子节点的下标 //求出左子节点的值(即从节点left开始,end); //当前节点的职位左子节点的值加上右子节点的值 
        tree[node] = tree[left] + tree[right]; } } void update(int a[],val); } //向上更新值 
        tree[node] = tree[left] + tree[right]; } } //求a[L]~a[R]的区间和 
int query(int a[],R); //相加即为答案 
        return sum_left + sum_right; } } int main(){ //从根节点(即节点0)开始建树,tree[i]); printf("\n"); //把a[x]改成6
    update(a,6); for(int i = 0; i <= 14; i ++) printf("tree[%d] = %d\n",tree[i]); printf("\n"); //求区间[2,5]的和
    int ans = query(a,5); printf("ans = %d",ans); return 0; }

运行结果:

【数据结构】线段树(Segment Tree)

学习视频链接

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读