线段树是一棵二叉树,树中的每一个结点表示了一个区间 [a,b] 。每一个
叶子节点上 a+1=b, 这表示了一个初等区间。对于每一个内部结点 b-a>1 ,
设根为 [a,b] 的线段树 为 T(a,b), 则 进 一步将此线段树分 为 左 子树 T(a,
(a+b)/2), 以及右子树 T((a+b)/2,b), 直到分裂为一个初等区间为止。
线段树的平分构造,实际上是用了二分的方法。线段树是平衡树,它的深
度为 lg(b-a) 。
如果采用动态的数据结构来实现线段树,结点的构造可以用如下数据结构:
其中 B 和 E 表示了该区间为 [B,E] ; Count 为一个计数器,通常记录覆
盖到此区间的线段的个数。 LeftChild 和 RightChild 分别是左右子树的根。
或者为了方便,我们也采用静态的数据结构。用数组 B[] , E[] , C[] ,
LSON[] , RSON[] 。设一棵线段树的根为 v 。那么 B[v],E[v] 就是它所表示
区间的界。 C[v] 仍然用来作计数器。 LSON[v] , RSON[v] 分别表示了它的
左儿子和右儿子的根编号。
评论0