数组实现线段树
常规线段树,数组实现!!!
问题
例题 数组区间内最小值、最大值、总和等问题;
定义
- 线段树 segmentTree 是一个二叉树,线段树可以用树也可以用数组(堆式存储)来实现。
- 线段树结构有点像堆,一般用数组来表示线段树的结构;
- 在
index = 0
的位置保存根节点,则左子节点是2 * index + 1
,右子节点是2 * index + 2
; - (若在
index = 1
的位置保存根节点,则左子节点是2 * index
,右子节点是2 * index + 1
) - 线段树中每个节点都表示一个区间的信息,如数组 nums 在区间 [s, e] 的最小值、最大值或总和等信息。
- 以区间总和为例,根节点存储所有元素的和;
- 原数组中的每一个元素都以叶子节点的形式存在于线段树中;
- 主要有3个操作:建树、查询、更新;
- 线段树将此类问题的查询以及更新的时间复杂度都变成了O(logn);
实现
以区间总和为例!!!
- start、end、left、right表示nums中的下标;
- [left, right]是检索区间;
- [start, end]是当前区间;
- node_idx表示线段树中的节点的下标;
建树
1 |
|
查询
根据区间范围从根节点递归地向树的两边查询;
1 |
|
更新
从对应的叶子节点开始更新到根节点;
1 |
|
数组实现线段树
http://example.com/2022/07/31/数组实现线段树/