0%

浅谈线段树

线段树介绍

线段树是处理区间问题的一种数据结构,它可以处理的问题有:

  • 区间查询
  • 单点查询
  • 区间更新
  • 单点更新

线段树的性质

  • 叶子节点记录的是一个实际数据
  • 非叶子节点记录的是它的孩子节点的值的和/积/最小值/最大值(只要可合并性质)

线段树的基本思想

一般来说,我们认为线段树是一个满二叉树,但是实际情况中,线段树表示的区间元素数量往往不是2的整数次幂。因此,线段树实际上是一个完全二叉树,

完全二叉树图片

线段树的基本操作

  1. 区间查询
    可以采用递归的方法来进行区间查询,头节点有一个区间[1,n],所有的节点都有一个区间(l,r),l=r说明是叶子节点,返回即可。

    如果ql,qr包含l,mid,那么递归左边。

    如果ql,qr包含mid+1,r,那么递归右边;

    统计和/积/最小值/最大值;

  2. 区间更新
    敲黑板 这里的操作涉及到一个叫“懒标记”的东西.

  • 懒标记

    好图不厌百回拿

    假如我要把圈出的区域都归0,我可以一个一个遍历(dfs/bfs),但是如果子树巨大,也会很慢。
    打标记
    这样不是更快?
  • 基本思路在此
    若完全被包含,设置懒标记,否则递归左右子树。
  1. 单点更新
    神图在此
    先递归找到节点,再一层一层更新节点。

实现网上很多,就不写了~~(懒~~

欢迎关注我的其它发布渠道