线段树基础教程

⚠️ 内容不完整:原网页使用 JavaScript 动态加载,仅获取到 41 行简介,缺少正文详细内容(三种线段树的实现原理、代码示例等)

raw/articles/2026/05/线段树基础教程

核心要点

线段树定义

线段树是 二叉树结构 的衍生,用于高效解决数组的 区间查询区间动态修改 问题。

时间复杂度

  • 区间查询:O(log N),支持任意长度区间
  • 区间动态修改:O(log N),支持任意长度区间
  • N 为数组中的元素个数

三种线段树变体

1. 基本线段树

  • 包含方法:query(区间查询)、update(单点修改)
  • 特点:叶子节点是数组中的元素,非叶子节点是索引区间(线段)的汇总信息
  • 限制:必须输入 nums 数组进行构建

2. 动态线段树(动态开点)

  • 运用「动态开点」技巧优化内存开销
  • 适用场景:处理稀疏数据,避免在大区间(如 [0, 10^9])上浪费空间
  • 优化:不需要一开始就分配 10^9 的空间,而是按需动态创建节点

3. 懒更新线段树

  • 新增方法:rangeAdd / rangeUpdate(区间更新)
  • 运用「懒更新」技巧
  • 核心思想:不需要立即更新区间内所有叶子节点,而是将更新值缓存在非叶子节点中
  • 传播时机:当调用 query 方法进行区间查询时,才逐渐将更新值向叶子节点传播
  • 时间复杂度:O(log N) 完成任意长度区间更新

前置知识

  • 二叉树:理解树结构和遍历方法
  • 二叉树的递归/层序遍历

相关概念

  • 线段树(Segment Tree)
  • 动态开点
  • 懒更新(Lazy Update)
  • 区间查询(Range Query)
  • 区间修改(Range Update)

Interactive Graph