线段树是什么
线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。(以上转自百度百科)
如果我们用根节点代表1~n这个区间,那么它的左儿子节点就代表区间1~(n+1)div 2,右儿子代表区间(n+1)div 2+1~n,以此类推(如下图)
线段树如何实现
我们用深搜来插入,查询与修改。
1,建树与区间查询
每次走到一个节点时,判断其是否被要查询的区间完全包含(如1~5完全包含1~4),如完全包含则将其保存的信息加入查询结果中,
若不被完全包含,则分三种情况讨论:
我们先设要查询的区间为l~r,当前节点代表的区间为l1~r1,分成两个区间l1~mid与mid+1~r1
- 若l<=mid且r>mid,说明要查询的区间同时涉及当前节点的左右儿子,所以两个区间l1~mid和mid+1~r都要深搜
- 若r<=mid则说明要查询的区间只涉及当前节点的左儿子,所以我们深搜左儿子
- l>=mid+1,与情况2类似。
这里可以说运用了分治的思想,因为我们要查询l~r,而l~r不一定刚好是某个节点代表的区间,所