# 平衡树
# 简介
平衡树是一种特殊的二叉搜索树,它通过特定的平衡条件来保证树的高度保持在 O(log n) 级别,从而确保基本操作的效率。平衡树的设计目标是避免树退化成链表,保持树的高度平衡,从而提供稳定的性能。
# 常见类型
# AVL树
特点
- 每个节点的左右子树高度差不超过1
- 严格平衡,平衡因子取值范围为{-1, 0, 1}
- 适合读多写少的场景
- 插入和删除操作可能会触发树的旋转操作
基本操作
- 左旋:当右子树过高时,将节点向左旋转
- 右旋:当左子树过高时,将节点向右旋转
- 左右旋:先左旋后右旋,用于处理LR失衡
- 右左旋:先右旋后左旋,用于处理RL失衡
平衡维护示例
# 红黑树
特点
- 节点是红色或黑色
- 根节点是黑色
- 叶子节点(NIL)是黑色
- 红色节点的子节点必须是黑色
- 从根到叶子的所有路径包含相同数量的黑色节点
- 相比AVL树,红黑树的平衡条件更宽松,插入删除时旋转次数更少
平衡维护示例
应用
- Java的TreeMap和TreeSet
- Linux内核的进程调度
- 文件系统
- C++ STL中的map和set
# 性能特征
查找:O(log n)
- AVL树和红黑树都能保证最坏情况下的对数时间复杂度
- AVL树由于更严格的平衡性,常数因子略小
插入:O(log n)
- AVL树最多需要2次旋转
- 红黑树最多需要2次旋转和O(log n)次颜色调整
删除:O(log n)
- AVL树最多需要O(log n)次旋转
- 红黑树最多需要3次旋转和O(log n)次颜色调整
# 应用场景
数据库索引
- B树和B+树是平衡树思想在磁盘存储中的应用
- 保证了大数据量下的高效查询
文件系统
- 用于管理文件的组织结构
- 支持快速的文件查找和目录遍历
优先队列
- 在调度系统中维护任务优先级
- 支持快速的插入和获取最高优先级元素