算法基础 -- 红黑树初识

打印 上一主题 下一主题

主题 1737|帖子 1737|积分 5211

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
红黑树初识

红黑树(Red-Black Tree)是一种自平衡的二叉搜索树,它通过对每个节点增加颜色属性,以及在插入和删除节点时利用特定规则调解树结构来保持平衡。红黑树的特点是,在任何环境下,其树高都可以保持在 (O(\log n)) 的级别,从而确保了高效的查找、插入和删除利用。

红黑树的五大性质


  • 节点颜色:每个节点要么是赤色,要么是玄色
  • 根节点为玄色:树的根节点始终是玄色。
  • 叶子节点为玄色:所有叶子节点(NIL,哨兵节点)都是玄色。
  • 赤色节点不能相邻:赤色节点的子节点必须是玄色(即不能有两个一连的赤色节点)。
  • 每个节点到其后代叶子的玄色节点数类似:对于恣意节点,从该节点到叶子的所有路径上,玄色节点的数量类似,这一性质确保了红黑树的平衡性。

红黑树的利用

1. 查找(Search)

查找利用与普通的二叉搜索树类似,根据键值巨细递归或迭代寻找目标节点。由于红黑树具有自平衡特性,查找的时间复杂度为 (O(\log n))。
2. 插入(Insertion)

红黑树插入新节点的过程分为两步:

  • 按照普通二叉搜索树的规则插入新节点,初始将新节点设为赤色
  • 根据红黑树的五大性质,对树结构举行修复,确保红黑性质不被破坏。
插入利用可能触发以下三种修复环境:
Case 1:叔节点是赤色

假如新节点的父节点和叔节点均为赤色:

  • 将父节点和叔节点涂黑。
  • 将祖父节点涂红。
  • 将祖父节点作为新节点,继续向上检查修复。
Case 2:叔节点是玄色,且新节点是右子节点

假如新节点的父节点是赤色,叔节点是玄色,且新节点是右子节点:

  • 对父节点举行左旋,将新节点调解到外侧。
  • 转化为 Case 3。
Case 3:叔节点是玄色,且新节点是左子节点

假如新节点的父节点是赤色,叔节点是玄色,且新节点是左子节点:

  • 对祖父节点举行右旋。
  • 交换祖父节点和父节点的颜色。
3. 删除(Deletion)

删除利用首先按普通二叉搜索树规则找到目标节点,然后:

  • 假如删除的节点是赤色:直接删除。
  • 假如删除的节点是玄色:会破坏黑高平衡,需要举行修复。
删除利用的修复场景包括以下四种:
Case 1:兄弟节点是赤色


  • 将兄弟节点涂黑,父节点涂红。
  • 对父节点举行旋转。
  • 转化为其他环境处置惩罚。
Case 2:兄弟节点是玄色,且兄弟的两个子节点均为玄色


  • 将兄弟节点涂红。
  • 将父节点作为新节点,向上递归修复。
Case 3:兄弟节点是玄色,兄弟的左子节点是赤色,右子节点是玄色


  • 将兄弟节点涂红,兄弟的左子节点涂黑。
  • 对兄弟节点举行右旋。
  • 转化为 Case 4。
Case 4:兄弟节点是玄色,兄弟的右子节点是赤色


  • 将兄弟节点的颜色设置为父节点的颜色。
  • 将父节点涂黑,兄弟的右子节点涂黑。
  • 对父节点举行旋转,修复完成。

插入利用示例

以插入以下节点序列为例:[7, 3, 18, 10, 22, 8, 11, 26, 2, 6, 13]
初始插入


  • 插入 7:树为空,7 作为根节点,设为玄色。
  • 插入 3:3 小于 7,挂到左侧,设为赤色。
  • 插入 18:18 大于 7,挂到右侧,设为赤色。
修复插入辩论


  • 插入 10:10 < 18,挂到 18 左侧;10 为赤色,与父节点 18 同为赤色,触发 Case 1。

    • 祖父节点 7 变红,父节点 18 和叔节点 3 变黑。
    • 根节点 7 重新涂黑。

  • 插入 22:直接插入,无需修复。
  • 插入 8:8 挂到 10 左侧,触发 Case 2 -> Case 3。

    • 左旋父节点 10,将 8 调解为外侧。
    • 右旋祖父节点 18,完成修复。


删除利用示例

以删除以下节点为例:[18, 3]
删除 18


  • 删除后,18 的后继节点(或直接替换节点)补位。
  • 假如删除的节点是玄色,触发 Case 1~4 中的修复规则,终极平衡树。
删除 3


  • 删除 3,修复兄弟节点颜色辩论。
  • 假如兄弟节点为玄色,且其子节点为玄色,触发 Case 2。
  • 递归向上调解,直到根节点或不再有辩论。

红黑树的实现与优化


  • 工程应用

    • C++ 的 std::map 和 std::set。
    • Java 的 TreeMap 和 TreeSet。

  • 红黑树 vs AVL 树

    • AVL 树高度更严格平衡,查询性能稍优。
    • 红黑树插入、删除效率更高,工程中更常用。


总结

红黑树的核心是通过“颜色束缚”和“旋转”保持平衡,插入与删除的修复逻辑基于几种典型场景(Case 1~4)。虽然实现上需要细心处置惩罚,但由于其高效的时间复杂度和广泛的工程应用价值,红黑树是二叉搜索树中非常重要的一种变体。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

天空闲话

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表