golang,go,博客,开源,编程

认识红黑树

Published on with 0 views and 0 comments

红黑树(Red-Black Tree)简介

红黑树是一种自平衡的二叉查找树(Binary Search Tree, BST),它在插入和删除节点时,通过对树的结构进行调整,保证了树的高度始终保持在对数级别,从而保证了基本操作(如查找、插入、删除)的时间复杂度为 O(log N)

红黑树的自平衡特性保证了树的高度不会太高,这使得它特别适用于需要频繁执行插入、删除和查找操作的应用场景,如数据库和文件系统。

红黑树的性质

红黑树在保持二叉查找树的基本特性(即对于每个节点,左子树的值小于节点值,右子树的值大于节点值)之外,还必须满足以下五个性质:

  1. 每个节点要么是红色,要么是黑色。
  2. 根节点是黑色的。
  3. 每个叶子节点(NIL 节点)是黑色的。
    • 叶子节点是指那些不存在子节点的节点,通常在红黑树中指代为 NIL 节点,这些节点不会保存任何数据。
  4. 如果一个节点是红色的,则它的子节点必须是黑色的。
    • 这也叫做“红色节点不能相邻”,即红色节点不能有红色子节点。
  5. 从任意节点到其所有后代叶子节点的路径上,必须包含相同数目的黑色节点。
    • 也就是说,黑色节点的数目在从根到叶子节点的路径上必须一致,这确保了树的高度保持平衡。

红黑树的操作

红黑树的基本操作有查找、插入、删除。在这些操作中,插入和删除是最复杂的,因为它们需要保持树的平衡。以下是这些操作的简介:

1. 查找操作

查找操作与普通的二叉查找树相同,从根节点开始,依次向左或向右遍历,直到找到目标节点或者达到叶子节点。

  • 时间复杂度:O(log N),因为红黑树的高度被限制在 log N 级别。

2. 插入操作

插入操作与普通的二叉查找树类似,首先要根据键值找到插入位置,然后插入新节点。插入的过程中,新的节点默认是红色的。插入后,可能会破坏红黑树的性质,需要进行相应的调整。

  • 插入后的调整:如果插入的节点导致了违反红黑树的性质,需要进行颜色变化和树的旋转(左旋或右旋)来恢复平衡。
  • 插入的调整步骤:
    • Case 1:插入节点的叔叔节点是红色。此时,可以通过改变节点的颜色,进行一次颜色翻转来恢复平衡。
    • Case 2:插入节点的叔叔节点是黑色,并且插入节点是外部节点(即插入的节点在祖父节点的外侧)。此时,通过旋转来恢复平衡。
    • Case 3:插入节点的叔叔节点是黑色,并且插入节点是内部节点(即插入的节点在祖父节点的内侧)。此时,通过旋转和颜色翻转来恢复平衡。

3. 删除操作

删除操作在红黑树中比插入操作稍微复杂一些。删除节点时,若删除的节点是黑色的,会破坏红黑树的性质,需要通过调整和旋转来恢复平衡。

  • 删除后的调整:如果删除的是一个黑色节点,可能会导致路径上的黑色节点数目不一致,需要通过一系列的旋转和颜色变换来恢复平衡。
  • 删除的调整步骤:
    • Case 1:删除节点的兄弟节点是红色。此时,进行颜色翻转和旋转。
    • Case 2:删除节点的兄弟节点是黑色,且兄弟节点的两个子节点都为黑色。此时,进行一次颜色翻转,避免进一步破坏树的平衡。
    • Case 3:删除节点的兄弟节点是黑色,且至少有一个子节点是红色。此时,进行旋转和颜色翻转,恢复平衡。

红黑树的旋转操作

在插入和删除过程中,我们经常需要进行旋转操作来保持树的平衡。旋转分为两种类型:

1. 左旋(Left Rotation)

左旋是将当前节点的右子节点变为父节点,当前节点变为左子节点。

      y                        x
     / \                      /   \
    x   T4     -->          T1     y
   / \                          / \   / \
  T1   T2                      T2  T3 T4
  • 旋转后的树依然是二叉查找树,且保持了红黑树的性质。

2. 右旋(Right Rotation)

右旋是将当前节点的左子节点变为父节点,当前节点变为右子节点。

      x                         y
     / \                       /   \
    T1   y      -->          x     T4
        / \                 / \  
       T2   T3            T1   T2
  • 同样,右旋后仍然保持二叉查找树和红黑树的性质。

红黑树的时间复杂度

红黑树的基本操作如查找、插入、删除等都需要经过一系列的旋转和颜色调整。由于红黑树的高度被限制在 O(log N) 级别,因此这些操作的时间复杂度是 O(log N)

  • 查找操作:O(log N)
  • 插入操作:O(log N)
  • 删除操作:O(log N)

红黑树的应用

由于红黑树提供了平衡的性能,因此它广泛应用于需要频繁插入、删除和查找的场景,特别是一些高效的容器类数据结构中:

  • C++ STL 中的 mapsetmapset 都是基于红黑树实现的。
  • Java 中的 TreeMapTreeSetTreeMapTreeSet 都是基于红黑树实现的。
  • 数据库和文件系统:许多数据库系统(如 Berkeley DB)和文件系统(如 ext4)也使用了红黑树来进行高效的索引和管理。

总结

红黑树是一种自平衡的二叉查找树,通过维护树的平衡来确保查找、插入、删除等操作的时间复杂度为 O(log N)。红黑树的平衡是通过一组严格的规则来保证的,插入和删除操作会根据需要进行颜色翻转和旋转,保持树的平衡。红黑树在许多实际应用中都非常有用,尤其是在需要频繁修改和查找数据的场合。


标题:认识红黑树
作者:mooncakeee
地址:http://blog.dd95828.com/articles/2025/01/06/1736155111412.html
联系:scotttu@163.com