线段树的创建

线段树的创建

代码是以求和为例

 

private void buildSegmentTree(int treeIndex,int l,int r);

treeIndex 是当前的位置,就是从头部,

l是左边界,r是右边界

buildSegmentTree(0,0,data.length-1);

 

mid求中间的位置 吧线段树分为两个部分 左边和右边

左边的开始边界就是l,最后边界就是mid

右边的边界开始是mid+1,末尾就是r

int mid=l+(r-l)/2;// (l+r)/2可以这样写,但是为了防止溢出l+(r-l)/2

左边一直递归,右边一样

buildSegmentTree(leftTreeIndex, l, mid);//左边节点
buildSegmentTree(rightTreeIndex, mid+1, r);//右边节点
        

最后是相加,因为不能扩展相加,自己定义了融合方法 merger
tree[treeIndex]=merger.merge(data[leftTreeIndex],data[r]);

        //在treeIndex的位置创建表示区间[l...r]的线段树
	private void buildSegmentTree(int treeIndex,int l,int r){
		
		if(l==r){//相等 一个位置就是左边或者最后一个
			tree[treeIndex]=data[l];
			return ;
		}
		
		int leftTreeIndex=leftChild(treeIndex);//左边节点
		int rightTreeIndex=rightChild(treeIndex);//右节点
		
		int mid=l+(r-l)/2;// (l+r)/2可以这样写,但是为了防止溢出l+(r-l)/2
		buildSegmentTree(leftTreeIndex, l, mid);//左边节点
		buildSegmentTree(rightTreeIndex, mid+1, r);//右边节点
		
		
		tree[treeIndex]=merger.merge(data[leftTreeIndex],data[r]);
	}

 

融合的代码

package com.binglian.SegmentTree;

/**
 * 融合器,两个相加
 * @author binglian
 *
 */
public interface Merger<E> {
	
	E merge(E a,E b);

	
}

主方法这里用到了jdk8的特性

吧匿名函数改为了拉姆达表达式(简化了函数)

package com.binglian.SegmentTree;

public class Main {

	public static void main(String[] args) {

		Integer[] nums={-2,0,3,-5,2,-1};
//		SegmentTree<Integer> segmentTree=new SegmentTree<Integer>(nums,new Merger<Integer>() {
//			
//			public Integer merge(Integer a,Integer b){
//				return a+b;
//			}
//		});
		
		//上面的匿名函数可以表示如下的简便方法
		SegmentTree<Integer> segmentTree=new SegmentTree<Integer>(nums,(a,b)->a+b);
		System.out.println(segmentTree);
	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值