博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线段树实例--灯笼哥大佬
阅读量:3960 次
发布时间:2019-05-24

本文共 2342 字,大约阅读时间需要 7 分钟。

线段树实例–灯笼哥大佬

import org.junit.Test;public class Test1 {
//线段树实现query,update,build @Test public void Test()//测试用例 {
int[] tree = new int[15]; int[] array = {
2,3,6,1,4,5}; build_tree(array,tree,0,array.length-1,0); update(array,tree,0,5,0,4,10); for (int i : tree) {
System.out.print(i+" "); } System.out.println(); System.out.println(query(array,tree,0,array.length-1,0,0,5)); } //array是原始数组,tree是用来存储线段树的数组,node_index是当前节点在tree中的索引 //start是当前节点对应区间的左边,end是当前节点的右边 //该函数的作用是将节点node_index及其子节点构建好 void build_tree(int[] array,int tree[],int start,int end,int node_index) {
if(start==end) {
tree[node_index] = array[start]; } else {
int mid = (start+end)/2; int left_node = 2*node_index+1; int right_node = 2*node_index+2; build_tree(array,tree,start,mid,left_node); build_tree(array,tree,mid+1,end,right_node); tree[node_index] = tree[left_node]+tree[right_node]; } } //该函数把索引为index的值改为val void update(int[] array,int tree[],int start,int end,int node_index,int index,int val) {
if(start==end) {
tree[node_index] = val; array[start] = val; } else {
int mid = (start+end)/2; int left_node = 2*node_index+1; int right_node = 2*node_index+2; if(index<=mid) {
update(array,tree,start,mid,left_node,index,val); } else {
update(array,tree,mid+1,end,right_node,index,val); } tree[node_index]=tree[left_node]+tree[right_node]; } } //查询在特定区间内的和 int query(int[] array,int tree[],int start,int end,int node_index,int L,int R)//该函数实际执行的是中返回在L-R间的所有元素的和 {
if(L>end||R
=L) return tree[node_index]; else {
int mid = (start+end)/2; int left_node = 2*node_index+1; int right_node = 2*node_index+2; int sum_left = query(array,tree,start,mid,left_node,L,R); int sum_right = query(array,tree,mid+1,end,right_node,L,R); return sum_left+sum_right; } }}

转载地址:http://wplzi.baihongyu.com/

你可能感兴趣的文章
17-python之for循环
查看>>
18-python之while循环,for循环与else的配合
查看>>
19-python之字符串简单介绍
查看>>
20-python之切片详细介绍
查看>>
P24-c++类继承-01详细的例子演示继承的好处
查看>>
P8-c++对象和类-01默认构造函数详解
查看>>
P1-c++函数详解-01函数的默认参数
查看>>
P3-c++函数详解-03函数模板详细介绍
查看>>
P4-c++函数详解-04函数重载,函数模板和函数模板重载,编译器选择使用哪个函数版本?
查看>>
P5-c++内存模型和名称空间-01头文件相关
查看>>
P6-c++内存模型和名称空间-02存储连续性、作用域和链接性
查看>>
P9-c++对象和类-02构造函数和析构函数总结
查看>>
P10-c++对象和类-03this指针详细介绍,详细的例子演示
查看>>
bat备份数据库
查看>>
linux数据库导出结果集且比对 && grep -v ---无法过滤的问题
查看>>
shell函数与自带变量
查看>>
linux下shell获取不到PID
查看>>
sort详解
查看>>
linux,shell中if else if的写法,if elif
查看>>
shell中单引号、双引号、反引号的区别
查看>>