2026/3/31 2:10:20
网站建设
项目流程
成都企业建网站,网站规划要点,网站备案地点选择,进修学校 网站建设目标#x1f332; 红黑树插入全解析#xff5c;4种情况真实示例#xff0c;彻底搞懂调整逻辑#xff01;#x1f511; 为什么红黑树值得学#xff1f;普通二叉搜索树#xff08;BST#xff09;在最坏情况下会退化成链表#xff0c;操作复杂度飙升至 O(n)。
而红黑树是一种… 红黑树插入全解析4种情况真实示例彻底搞懂调整逻辑 为什么红黑树值得学普通二叉搜索树BST在最坏情况下会退化成链表操作复杂度飙升至 O(n)。而红黑树是一种自平衡 BST通过五条简单规则保证树高始终 ≤ 2 log₂(n1)使查找、插入、删除稳定在 O(log n)。虽然408大纲不要求手写代码但理解插入调整的逻辑是高频考点尤其要掌握插入后可能违反哪条性质分哪几种情况处理每种情况如何修复今天我们就用四个精心构造的真实例子把红黑树插入讲透 红黑树五大性质必须牢记每个节点非红即黑根节点必须是黑色所有 NIL 叶子空指针视为黑色不能有两个连续的红色节点红父不能有红子从任意节点到其所有后代 NIL 路径上黑色节点数量相同称为“黑高一致”⚠️ 插入新节点时默认设为红色——这样不会破坏性质5黑高只可能违反性质4。 插入后的四种情况详解设N新插入节点红色PN 的父节点GP 的父节点N 的祖父UG 的另一个孩子N 的叔叔下面逐一讲解四种情况并附完整合法示例。✅ 情况1父节点 P 是黑色→ 无需任何调整 示例初始合法红黑树B(10) / \ B(5) B(20)插入3作为 5 的左孩子标红B(10) / \ B(5) B(20) / R(3)✅ 验证P B(5) 是黑 → 不违反性质4所有路径黑高仍为2如 10→5→3→NILB-B-R-黑 → 黑节点数2合法插入结束 情况2P 为红U 也为红→ 变色上推P 和 U 染黑G 染红若 G 非根继续向上检查这是唯一不需要旋转的情况靠“颜色重分配”解决问题。 正确示例初始树严格合法初始树B(15) / \ R(10) R(20)✅ 合法性验证根为黑 ✔️红节点10, 20子节点为 NIL黑✔️所有路径黑高 2B-R-黑✔️现在插入5作为 10 的左孩子红色B(15) / \ R(10) R(20) / R(5) ← N 判断P R(10) → 红U R(20) → 红G B(15) → 黑✅ 符合情况2调整步骤P(10) 染黑U(20) 染黑G(15) 染红得到R(15) / \ B(10) B(20) / R(5)⚠️ 但根不能为红所以最后一步若 G 是根节点则强制染黑。最终结果B(15) / \ B(10) B(20) / R(5)✅ 再次验证无连续红 ✔️所有路径黑高 2 ✔️根为黑 ✔️ 合法 如果 G 不是根比如上面还有祖先则以 G 为新当前节点继续检查是否违反性质可能递归。 情况3P 为红U 为黑或 NIL且 N 与 P 同侧直线LL 或 RR→ 单旋 变色 示例RR 型右-右初始合法树B(20) / \ B(10) B(30) \ R(40)✅ 黑高验证左路径20→10→NIL → 黑高2右路径20→30→40→NIL → 黑节点20,30 → 黑高2 ✔️插入50作为 40 的右孩子B(20) / \ B(10) B(30) \ R(40) \ R(50) ← N 判断P R(40) → 红G B(30) → 黑U 30 的左孩子 NIL → 黑N 是 P 的右孩子P 是 G 的右孩子 →RR 直线✅ 符合情况3调整步骤将 G(30) 染红将 P(40) 染黑对 G(30) 做左旋旋转后B(20) / \ B(10) B(40) / \ R(30) R(50)✅ 验证40 为黑子节点红 → 无连续红所有路径黑高 2根为黑 完美 LL 型左-左同理对 G 做右旋。 情况4P 为红U 为黑且 N 与 P 异侧折线LR 或 RL→ 先旋父变直线再按情况3处理双旋 变色 示例RL 型右-左使用同一初始树B(20) / \ B(10) B(30) \ R(40)插入35作为 40 的左孩子B(20) / \ B(10) B(30) \ R(40) / R(35) ← N 判断P R(40) → 红G B(30) → 黑U NIL → 黑P 是 G 的右孩子N 是 P 的左孩子 →RL 折线✅ 符合情况4调整步骤对 P(40) 做右旋→ 变成 RR 直线对 G(30) 做左旋将新根35染黑原 G(30) 染红步骤1右旋 P(40)B(20) / \ B(10) B(30) \ R(35) \ R(40)步骤2左旋 G(30)并变色B(20) / \ B(10) B(35) / \ R(30) R(40)✅ 验证35 为黑子节点红 → 合法无连续红所有路径黑高 2 调整成功 LR 型左-右则先对 P 做左旋再对 G 做右旋。 四种情况速查表情况条件操作是否旋转1P 为黑无操作❌2P 红 U 红P、U 染黑G 染红递归❌3P 红 U 黑 直线LL/RR单旋 G/P 变色✅1次4P 红 U 黑 折线LR/RL双旋 新根染黑✅2次 408 考研重点提醒✅必考判断一棵树是否满足红黑树性质尤其黑高和连续红✅理解插入后四种情况的触发条件与修复思想❌不要求手写完整插入/删除代码✅可能考简答红黑树 vs AVL 树红黑树旋转更少适合频繁插入 结语红黑树不是魔法而是用颜色约束换取高效平衡的工程智慧。掌握这四种插入情形你不仅能应对408考题更能理解TreeMap、std::map背后的设计哲学。下次看到“红黑”别怕——你已经看透它的“黑”科技 动手练习完整过程插入序列 [10, 20, 30, 15, 25]我们一步步插入观察每一步的调整。第1步插入 10树为空直接插入根必须为黑B(10)第2步插入 20作为 10 的右孩子默认红色P B(10)黑→情况1无需调整B(10) \ R(20)第3步插入 30作为 20 的右孩子红P R(20)红G B(10)黑U NIL黑N 与 P 同侧右-右→情况3RR 型 调整G(10) 染红P(20) 染黑对 G(10) 左旋结果B(20) / \ R(10) R(30)✅ 合法第4步插入 15作为 10 的右孩子红当前树B(20) / \ R(10) R(30)插入后B(20) / \ R(10) R(30) \ R(15)分析P R(10)红G B(20)黑U R(30)红→情况2 调整P(10) 和 U(30) 染黑G(20) 染红G 是根 → 最后染回黑结果B(20) / \ B(10) B(30) \ R(15)✅ 合法第5步插入 25作为 30 的左孩子红当前树B(20) / \ B(10) B(30) \ \ R(15) NIL插入后B(20) / \ B(10) B(30) \ / R(15) R(25)分析N R(25)P B(30) 30 是黑所以P 为黑 →情况1无需调整最终红黑树B(20) / \ B(10) B(30) \ / R(15) R(25)✅ 验证无连续红 ✔️所有路径黑高 2如 20→10→15→NILB-B-R-黑 → 黑高2✔️根为黑 ✔️ 完全合法✨恭喜你通过这个练习你已经亲手走完了红黑树插入的核心场景。延伸建议尝试插入 27、35看看是否会触发情况3或4