红黑树Red-black tree
通过颜色约束和局部调整保持搜索树高度受控。
- 核心约束
- 路径黑高相同,红节点不能有红孩子。
- 适用问题
- 动态有序索引、范围查询与定时事件管理。
- 边界与取舍
- 节点指针与旋转维护有成本;增强字段需随修改更新。
常见操作#
n 为节点数,k 为范围查询输出数。
| 操作 | 时间复杂度 | 条件与说明 |
|---|---|---|
| 查找 / 插入 / 删除 | 最坏界;需要维护红黑不变量,比较成本按 计算。 | |
| 最小 / 最大 / 前驱 / 后继 | 从根定位;Linux rb_root_cached 的最左节点读取可为 。 | |
| 有序遍历 | 完整迭代所有节点;单步后继的最坏成本与整段遍历的摊还成本不同。 | |
| 范围枚举 | 先找范围起点,再输出 k 个节点。 |
时间与空间#
- 时间复杂度
- 查找 / 更新最坏
- 存储空间
增广字段需在链接和旋转后更新;维护成本取决于增广函数。
工程中的应用#
5 个案例 · 附源码Linux 公平调度将 EEVDF 的资格条件与虚拟截止时间结合,用增强红黑树搜索候选任务。
附源码片段 · 调度与资源分配
hrtimer 通过 timerqueue 的红黑树维护到期顺序,并缓存最早到期节点。
附源码片段 · 调度与资源分配
nginx 事件定时器以到期时间为键放入红黑树,事件循环读取最小键确定等待上限。
附源码片段 · 调度与资源分配
limit_req 把漏桶计算、红黑树查状态与队列回收组合起来,按配置的 key 管理请求速率。
附源码片段 · 通信与流量
Linux v6.5 的 CFS 将可运行实体按 vruntime 放入红黑树,用加权运行时间作为公平性的基准。
附源码片段 · 调度与资源分配