1、线段树介绍
2、线段树的基础表示
3、创建线段树、线段树区间查询
线段树实现的代码如下:
package com.lkj;
public class SegmentTree<E>
{
/*
使用一个数组表示区间.
首先,用户可能要获取区间内某一个的元素,或者获取区间的某一个属性,我们在线段树中创建数组,作为区间数组的的副本,用于给出区间数组的某些属性;
其次,我们想将data数组内的元素(arr数组区间传递进来的)组织成为一个线段树,那么还需要创建一个tree,大小为 4size
*/
private E[] data;
//tree结点虽然表示的是一个区间,但是它里面存储的实际上是区间内数据按一定方式计算得到的值。
// 存储区间只是一种方式,目的还是得到区间内数字通过计算得到的值!
private E[] tree;
private Merger<E> merger;
//初始化的时候传入一个区间数组
public SegmentTree(E[] arr , Merger<E> merger)
{
this.merger = merger;
data = (E[])new Object[arr.length];//使用arr初始化data
for (int i = 0; i < arr.length ; i++)
{
data[i] = arr[i];
}
tree = (E[])new Object[arr.length * 4];
//调用 buildSegmentTree() 方法,完成线段树数组tree每一个结点 data数组区间的确定!
//这样线段树一初始化,它的线段树数组中每一个结点所表示的 data数组的区间也确定了!
buildSegmentTree(0