此次我们介绍的是递归版的线段树。
“线段树是一种特殊的区间树“
线段树是什么东西?
简单的说,线段树是把 [1,n] 一段区间不断二分二分,直至每个树的节点是[i,i]的区间
[1,7]
[1,4] [5,7]
[1,2] [3,4] [5,6] [7,7]
[1,1] [2,2] [3,3] [4,4] [5,5] [6,6]
(线段树未必是一个满二叉树,但一定是个平衡二叉树)
/* 讨论在数组的情况下构造*/
Section A 基本操作
一、如何构造?
a) 如何构造左右子树关系?
假设根节点为root,左儿子lson 右儿子rson
不妨lson = root << 1 , rson = lson | 1
画一张图,把节点序号的二进制写出来你就知道为什么这么做
b) 如何建立树?
从最大的区间开始,每次二分 mid = (lson+rson) >> 1
递归建立lson,mid区间和mid+1,rson区间
当区间只有一个数的时候,保存数据
c) 更新:
在构造过程中首先是build(lson,mid),build(mid+1,rson)
然后需要发挥线段树的功能,能够快速询问维护一段区间的值比如
tree[root].max = max{tree[lson].max,tree[rson],max}
tree[root].sum = tree[lson].sum + tree[rson].sum
二、询问操作
a) 朴素法
在构造时,对于每个节点保存左右区间的范围。
然后递归寻找Query(root,L,R)
分三类情况: