1.什么是线段树:
线段树首先是一种二叉搜索树,为什么说是“线段”树呢?完全可以这么理解,即树中的每一个结点中存有一个区域(从起点到终点就好似线段一般),在下文中我将统一的将其称为该节点的管辖区域这样,我们就可以把线性的区域变为半线性的树。树有很多好处,比如说更改和查询操作的时间复杂度都是O(nodenum),在频繁的查询修改的问题中线段树将会起到非常大的作用。
2.线段树的表示:
为了更好的说明这个问题,我画了一张图给出一个更为直观的印象(我刚开始接触线段树的时候,就是用的这种最笨最朴素的办法,抽象思维能力不够只能借助这样的工具来加深印象)。
说明:假设我们目前有10个数,存储在数组中:
A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9] A[10]
将该数组转化为线段树后,将会得到下图:
稍微解释一下,每一个结点里边的数字即该结点的编号,旁边的区间即该结点的管辖区间。
如tree[1]管辖的区间是[1,10]
很容易发现一个规律,即结点node的左儿子的标号是node*2,右儿子的标号是node*2+1.这里就是我们一个重要的构造原则。