线段树模板(Java)

一、线段树概念

  线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。它的主要优势是对于区间求和、区间求最大值、区间修改和单点修改的速度快,时间复杂度能达到 O ( l o g N ) O(logN) O(logN)
  若以常规的方法在数组中进行区间求和等操作,时间复杂度会达到 O ( n ) O(n) O(n),若操作的次数量非常大,那么就很容易超时。线段树的优势就体现出来了
  线段树的实现基于一维数组,用数组下标 2 ∗ k + 1 2 * k +1 2k+1 的元素代表左儿子,用下标 2 ∗ k + 2 2 * k +2 2k+2 的元素代表右儿子来进行树的模拟

对于本文有不理解的小伙伴,建议看B站的这个视频:线段树

二、线段树模板

模板题:操作格子

1.建树

  • 线段树建树的操作跟二叉树的建树操作很类似,都利用递归,构建左儿子和右儿子。
  • 任意一个结点 k k k,它的左儿子为第 2 ∗ k + 1 2 * k +1 2k+1 个元素,右儿子为第 2 ∗ k + 2 2 * k +2 2k+2 个元素。本例根结点存储的是左儿子和右儿子的和,可应用于区间求和的场景
  • 建树时,需要声明一个新的一维数组来存储树的元素,这个数组的大小一般设为原数组长度的4倍及以上
  • static int[] arr = {1,3,5,7,9,11};
    static int[] tree = new int[4 * arr.length];

代码:

	/**
	 * @param node 当前结点
	 * @param l 当前结点对应的区间为l~r
	 * @param r
	 */
	public static void build(int node, int l, int r) {
   
   
		if (l == r) {
   
   
			tree[node] = arr[l];
			return;
		}
		int mid = (l + r) >> 1;
		int l_child = 2 * node + 1;
		int r_child = 
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Easenyang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值