c语言线段树建树程序,C语言 | 线段树

#include

#define MAX_LEN 1000

void build_tree(int arr[],int tree[],int node,int start,int end)

{

/*

int arr[]: y

int tree[]:

int node:树的根节点

int start:arr数组的

int end:arr数组的

*/

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;

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)

{

/*

int idx:要更改的数在arr中的编号

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 qury_tree(int arr[],int tree[],int node,int start,int end,int L,int R)

{

//计算范围在L-R的和

printf("start = %d\n",start);

printf("end = %d\n",end);

printf("\n");

if(Rend)

{

return 0;

}

else if(L<= start && end<=R)

{

return tree[node];

}

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 = qury_tree(arr,tree,left_node,start,mid,L,R);

int sum_right = qury_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[MAX_LEN] = {0};

build_tree(arr,tree,0,0,size-1);

printf("create:\n");

int i;

for(i=0;i<15;++i)

{

printf("tree[%d] = %d\n",i,tree[i]);

}

printf("update:\n");

update_tree(arr,tree,0,0,size - 1,4,6);

for(i=0;i<15;++i)

{

printf("tree[%d] = %d\n",i,tree[i]);

}

printf("qury_tree:%d\n",qury_tree(arr,tree,0,0,size-1,2,5));

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值