描述
三个操作:1.build创建线段树
2.update单节点修改
3.query区间和的求值
1.创建线段树
数组存储,用回忆堆的存储方式,线段树的使用和递归息息相关
数组a[]存储创建线段树的值,t[]为数组存储后的线段树
代码:
void build_tree(int a[] , int t[] , int node , int start , int end)
{
if(start == end) //递归出口,当start=end时表示到了叶子节点
{
t[node] = a[start];
return;
}
int mid = (start + end) / 2;
int left_node = 2 * node + 1;
int right_node = 2 * node + 2;
build_tree(a , t , left_node , start , mid);
build_tree(a , t , right_node , mid + 1 , end);
t[node] = t[left_node] + t[right_node]; //更新当前节点的区间和
}
2.单节点修改
idx为传入的需要修改的a数组下标,将其修改为val
代码:
void update_tree(int a[] , int t[] , int node , int start , int end , int idx , int val)
{
if(start == end) //递归出口,找到位置时进行修改,需要注意的是,同时修改t数组和a数组中的值
{
a[idx] = val;
t[node] = val;
return;
}
int mid = (start + end) / 2;
int left_node = 2 * node + 1;
int right_node = 2 * node + 2;
if(idx >= start && idx <= mid)
update_tree(a , t , left_node , start , mid , idx , val)