红黑树-非黑即红

红黑树是一种自平衡二叉搜索树 ,通过节点着色(红/黑)和旋转规则,保证最长路径≤2×最短路径 ,使增删查稳定在 O(log n)

一、五大性质

  1. 节点非红即黑。
  2. 根节点为黑
  3. 所有叶子(NIL空节点)为黑
  4. 红节点的子节点必为黑(无连续红节点)。
  5. 任意节点到其所有后代NIL的路径上,黑节点数量相同(黑高一致)。

二、核心推论

  • 最长路径(红黑交替)≤ 最短路径(全黑)×2 → 树高平衡、无退化。
  • 插入最多2次旋转 ,删除最多3次旋转,比AVL树平衡更宽松、修改更快。

三、基本操作

1. 插入(新节点默认红色)
  • 按BST规则插入,新节点设为红色(不破坏黑高)。
  • 修复规则4(父红则冲突):
    • 情况1:叔节点红 → 父、叔变黑,祖父变红,向上递归。
    • 情况2:叔黑、当前是右孩子 → 左旋父节点,转为情况3。
    • 情况3:叔黑、当前是左孩子 → 右旋祖父,父变黑、祖父变红。
2. 删除
  • 按BST删除,用后继节点替代;删黑节点会破坏黑高,需修复。
  • 修复"双黑"(路径缺1黑):
    • 情况1:兄弟红 → 兄弟变黑、父变红,旋转父节点,转情况2/3/4。
    • 情况2:兄弟黑、两侄黑 → 兄弟变红,双黑上移至父。
    • 情况3:兄弟黑、左侄红、右侄黑 → 右旋兄弟,左侄变黑,转情况4。
    • 情况4:兄弟黑、右侄红 → 旋转父,兄弟继承父色,父变黑、右侄变黑,结束。
3. 旋转(保持BST有序)
  • 左旋:以x为轴,右孩子y上浮,y左子树转给x。

  • 右旋:以x为轴,左孩子y上浮,y右子树转给x。

四、与AVL树对比

维度 红黑树 AVL树
平衡严格度 宽松(最长≤2×最短) 严格(高度差≤1)
旋转次数 少(插2删3) 多(删可能多次)
适用场景 频繁增删(Java TreeMap、C++ map) 查询密集

五、典型应用

  • Java:TreeMapTreeSetHashMap 链表转红黑树。
  • C++:std::mapstd::set
  • Linux 内核:进程调度、内存管理。
  • 数据库:索引结构优化。
相关推荐
麻瓜生活睁不开眼6 小时前
Android16修改全局桌面视图边框四直角显示为弧边圆角
android·java·深度学习
dear_bi_MyOnly6 小时前
【MyBatis 操作数据库】
java·数据库·学习·mybatis·学习方法
Wang's Blog6 小时前
Go-Zero 项目开发43:基于 Filebeat 收集各个服务的日志信息
开发语言·golang·go-zero·filebeat
2601_953720826 小时前
【计算机毕业设计】基于Spring Boot的心理健康咨询与评测系统的设计与实现
java·spring boot·后端
丈剑走天涯7 小时前
JDK 17 正式特性
java·开发语言
秋田君7 小时前
QT_QFontDialog类字体对话框
开发语言·qt
圣光SG7 小时前
Java操作题练习(七)
java·开发语言·算法
麻瓜老宋9 小时前
AI开发C语言应用按步走,表达式计算器calc的第二十三步,多行输入、进制输出、错误恢复、常量折叠、配置加载等
c语言·开发语言·atomcode
q567315239 小时前
企业级 HTTP 代理采购选型:技术评估清单 15 项
开发语言·网络·爬虫·网络协议·http·隧道ip·代理ip
@航空母舰9 小时前
SpringBoot通过Map实现天然的策略模式
java·spring boot·后端