LeetCode——线段树

本文介绍了线段树这一数据结构,它是一棵完全二叉树,用于表示区间信息。线段树的每个节点代表一个区间,叶子节点代表单位区间。文章通过讨论线段树的大小,解释了为何通常数组长度是原区间长度的4倍,并提供了相关资源以深入理解。此外,还提到了线段树节点数量的推导,总结点数不超过4N-1,因此通常开辟4N的空间来存储。
摘要由CSDN通过智能技术生成

线段树的定义:
首先,线段树是一棵完全二叉树。它的特点是:每个结点表示的是一个线段,或者说是一个区间。事实上,一棵线段树的根结点表示的是“整体”区间,而它的左右子树也是一棵线段树,分别表示区间的左半边和右半边。树中的每个结点表示一个区间[a,b]。每一个叶子结点表示一个单位区间。对于每一个非叶结点所表示的结点[a,b],其左孩子表示的区间为[a,(a+b)/2],右孩子表示的区间为[(a+b)/2,b]。 用T(a, b)表示一棵线段树,参数a,b表示区间[a,b],其中b-a称为区间的长度,记为L。如下图
在这里插入图片描述
实际上,用语言描述有点麻烦,具体可以看B站视频,还有一些其他人的介绍:线段树

话不多说,上代码:

class SegTree {
   

	vector<int> nums;
	int numsLen;
	vector<int> trees;
	void buildTree(int index, int left, int right) {
   
		// index为当前结点在二叉树中的标号,left right 对应nums中的范围,即当前结点index所管理的范围为nums[left, right]
		if (left >= right) {
   
			trees[index] = nums[left];
			return;
		}
		int mid = (left + right) / 2;
		int node_left = index * 2 + 1;	// 左结点的下标
		int node_right = index * 2 + 2;	// 右结点的下标
		buildTree(node_left, left, mid);
		buildTree(node_right, mid + 1, right);

		trees[index] = trees[node_left] + trees[node_right];	// 改变当前结点的值,分治思想
	}

	// 查找区间
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值