【2022 408】红黑树知识点总结

本文深入介绍了红黑树的基本概念、性质、操作特性及其在不同场景的应用。探讨了红黑树的自平衡机制,包括左旋、右旋及变色等调整方法。详细解析了插入、删除节点时的冲突处理与树的恢复过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 红黑树

    • 概述

    • 性质

      • 每个节点的颜色只能是红色/黑色
      • 根节点是黑色
      • 每个叶子节点都带有两个空的黑色节点(哨兵),若一个节点n只有一个左孩子,那么n的右孩子是一个黑哨兵;如果结点n只有一个右孩子,那么n的左孩子是一个黑哨兵。
      • 如果一个结点是红的,则它的两个儿子都是黑的。也就是说在一条路径上不能出现相邻的两个红色结点。
      • 对于每个结点来说,从该结点到其子孙叶结点的所有路径上包含相同数目的黑结点。
    • 操作特性

      • 每一个红黑树也是一个二叉查找树,因此红黑树上的只读操作与普通二叉查找树上的只读操作相同。
      • 在红黑树上进行插入操作和删除操作会导致不再符合红黑树的性质。
      • 恢复红黑树的性质需要少量(O(log n))的颜色变更和不超过三次树旋转(对于插入操作是两次)。
      • 虽然插入和删除很复杂,但操作时间仍可以保持为 O(log n) 次。
    • 自平衡

      • 左旋


        以某个结点作为支点(旋转结点),其右子结点变为旋转结点的父结点,右子结点的左子结点变为旋转结点的右子结点,左子结点保持不变。
        • 算法实现

      • 右旋


        以某个结点作为支点(旋转结点),其左子结点变为旋转结点的父结点,左子结点的右子结点变为旋转结点的左子结点,右子结点保持不变。
        • 算法实现

      • 变色
        变色:结点的颜色由红变黑或由黑变红。

    • 查找算法

    • 插入算法

      • 首先以二叉查找树的方法增加节点并标记为红色
      • 进行二叉查找树中插入节点的算法

      • 新插入节点设置为红色后,可能会导致出现两个连续红色节点的冲突,那么可以通过颜色调换和树旋转调整(修正操作)

        • 情形1:没有父节点,新节点N位于树的根上——将新节点重绘为黑色
          红黑树为空树 满足性质2
        • 情形2:新节点的父节点P是黑色,所以性质4没有失效(新节点是红色的)。
          树有效,满足性质4 5
        • 新节点的父节点为红色

          • 情形3:N是新节点,如果父节点P和叔父节点U二者都是红色。

            • 将父节点和叔父节点重绘为黑色,祖父节点重绘为红色
              新节点N有了一个黑色的父节点P。在这些路径上的黑节点数目没有改变。
            • 但是,红色的祖父节点G的父节点也有可能是红色的,这就违反了性质4。为此在祖父节点G上递归地进行情形1的整个过程。把祖父节点G当做新节点进行检查
          • 情形4:N是新节点,父节点P为红色而叔父节点U是黑色或者缺少,N为P的左孩子,P又是G的左孩子


            若P和U位置对调,则在下面的第二步进行左旋转
            • P设为黑色,G设为红色
            • 进行针对祖父节点G的右旋转
              之前的父节点P现在是新节点N和以前的祖父节点G的父节点,满足性质4 5
          • 情形5:N是新节点,父节点P是红色而叔父节点U是黑色或缺少,N为P的右孩子,P又是G的左孩子

            • 进行针对P的左旋调换N和P的角色
            • 把P设置为插入节点,进行情形4的处理
    • 删除算法

      • 首先,将红黑树当做一棵二叉查找树,将该节点从二叉查找树中删除

      • 然后,通过“旋转和重新着色”等一系列来修正该树,使之重新成为一棵红黑树。


        分三种情况
        • 普通二叉树操作
          • 被删除节点没有儿子,即为叶节点。那么,直接将该节点删除就OK了。
          • 被删除节点只有一个儿子。那么,直接删除该节点,并用该节点的唯一子节点顶替它的位置。
          • 被删除节点有两个儿子。那么,把“它的后继节点的内容”复制给“该节点的内容”;之后,删除“它的后继节点”。
        • 红黑树操作

          • 情形1:删除节点无子节点,则删除节点可能为红色/黑色
            • 红色直接删除

            • 黑色,删除平衡操作


              对于红黑树来说可能失衡,因为nil是黑色,删除该节点相当于该分支上少了一个黑色节点
          • ➢ 我们只需要讨论删除只有一个儿子的节点
            • 情形2:只有一个子节点时,删除节点只能是黑色,其子节点为红色,否则无法满足红黑树的性质了。 此时用删除节点的子节点接到父节点,且将子节点颜色涂黑,保证黑色数量

            • ➢ 如果它两个儿子都为空,我们任意将其中一个看作它的儿子。
            • ➢ 如果需要删除的节点有两个儿子,那么问题可以被转化成另一个删除只有一个儿子的节点的问题
          • ➢ 难点在于要删除的节点和它的儿子二者都是黑色的时候——平衡操作


            如果儿子N和它原始的父亲是黑色,则删除父亲导致通过N的路径都比不通过它的路径少了一个黑色节点。 这违反了性质5,需要重新平衡。
            • 替代节点


              投射后,找被删除节点最近节点做替代,一般找大于删除节点的最小节点,删除操作删除的结点可以看作删除替代结点,而替代结点最后总是在树末
            • 情形1:替换节点为黑色,删除后儿子N为新的根
              N即为替代节点,删除了一个黑色,新根是黑色,性质都保持
            • 情形2:替换节点为黑色,S为红色


              先变换后删除
            • 情形3:删除后新节点N的父亲P,兄弟S和S的儿子都是黑色


              重绘S为红色
              简单的重绘S为红色。结果是通过S的所有路径,都少了一个黑色节点。因为删除N的初始的父亲使通过N的所有路径少了一个黑色节点,这使事情都平衡了起来。但是,通过P的所有路径现在比不通过P的路径少了一个黑色节点,所以仍然违反性质5。要修正这个问题,我们要从情形1开始,在P上做重新平衡处理
            • 情形4:替代节点N、S和S的儿子都是黑色,但是N的父亲是红色


              在这种情形下,交换N的兄弟和父亲的颜色。这不影响不通过N的路径的黑色节点的数目,但是它在通过N的路径上对黑色节点数目增加了一,添补了在这些路径上删除的黑色节点。
            • 情形5:删除后新节点N的S是黑色,S的左儿子是红色,S的右儿子是黑色


              在S上做右旋转,这样S的左儿子成为S的父亲和N的新兄弟。接着交换S和它的新父亲的颜色。所有路径仍有同样数目的黑色节点,但是现在N有了一个右儿子是红色的黑色兄弟,所以我们进入了情形6。N和它的父亲都不受这个变换的影响。
            • 情形6:调整后N节点的S是黑色,S的右儿子是红色,而N是它父亲的左儿子。


              在这种情形下我们在N的父亲上做左旋转,这样S成为N的父亲(P)和S的右儿子的父亲。接着交换N的父亲和S的颜色,并使S的右儿子为黑色。子树在它的根上的仍是同样的颜色,所以性质3没有被违反。
    • 红黑树应用

      • 并行数据库
      • 内存数据库
      • 设计可近似匹配的索引数据结构
<think>好的,我现在需要帮助用户了解红黑树的相关知识总结,包括数据结构、特性、运行规则等。首先,我需要回顾用户提供的引用内容,确保信息准确且符合用户需求。 用户提供的引用共有5个,其中提到了红黑树的五大特性、旋转操作、与平衡树的对比以及应用场景。根据这些内容,我需要整理出一个结构清晰的回答,涵盖红黑树的定义、核心特性、运行规则、与平衡树的区别以及应用场景。 首先,红黑树的定义部分,需要说明它是一种二叉搜索树,并引用相关的引用[3]和[4]。接着是五大特性,引用[2]和[4]中提到父子节点不能同为红色,以及从根到叶子的黑色节点数量相同。这里要详细列出每个特性,并适当解释。 然后是运行规则,即插入和删除时的调整操作,引用[2]提到的变色和旋转操作,需要解释左旋、右旋以及颜色调整的步骤。这里可能需要结合示例,但用户要求尽量简洁,所以用步骤式说明即可。 接下来是比较红黑树与平衡树,引用[5]指出平衡树的严格高度差导致频繁调整,而红黑树通过放宽条件减少旋转次数,这里需要对比两者的优缺点,并说明红黑树的优势。 应用场景部分,引用[1]提到红黑树在编程语言和框架中的应用,比如Java的TreeMap和C++的STL,需要具体举例,并说明其高效性。 最后生成相关问题,考虑用户可能想深入的部分,比如调整策略、复杂度、应用实例、与平衡树的区别以及学习路径。确保问题覆盖回答中的各个部分,帮助用户进一步学习。 需要注意,所有数学表达式如时间复杂度$O(\log n)$要用行内格式,独立公式如调整步骤可能需要用单独段落,但根据引用内容,可能不需要复杂公式,所以主要使用行内格式。同时检查LaTeX语法是否正确,如斜体、括号匹配等。 现在整理结构: 1. 定义与核心特性 2. 五大特性详细说明 3. 运行规则(插入删除调整) 4. 与AVL树的对比 5. 应用场景 6. 相关问题 确保每个部分引用正确的来源,例如特性部分引用[2][4],运行规则引用[2][3],应用场景引用[1]。避免遗漏关键点,如红黑树通过规则保证近似平衡,而非严格平衡,这点在比较时很重要。 最后,生成的相关问题需要针对总结中的每个主要部分,比如调整策略对应运行规则,复杂度对应特性中的高度限制,应用实例对应应用场景,区别对比对应与AVL树的比较,学习路径引导用户进一步学习。 检查是否所有引用都正确标注,例如在提到颜色调整时引用[2],提到旋转操作时引用[3]。确保回答用中文,结构清晰,分点明确,符合用户要求的格式。</think>### 红黑树知识总结 #### 一、定义与核心特性 红黑树是一种**自平衡的二叉搜索树**,通过颜色标记(红/黑)和旋转操作维护近似平衡,确保查找、插入、删除操作的时间复杂度为$O(\log n)$[^3][^4]。其核心特性由以下五点构成: 1. **根节点为黑色**; 2. **叶子节点(NIL节点)为黑色**; 3. **红色节点的子节点必须为黑色**(即父子节点不能同时为红)[^2]; 4. **从任一节点到其所有叶子节点的路径中,黑色节点数量相同**; 5. **新插入的节点默认为红色**,后续通过调整满足规则[^4]。 #### 二、运行规则:插入与删除调整 当插入或删除节点破坏红黑树特性时,通过以下操作调整: 1. **颜色变换**:例如将父节点和叔节点由红变黑,祖父节点由黑变红; 2. **旋转操作**: - **左旋**:以某节点为支点,右子节点上升为父节点; - **右旋**:以某节点为支点,左子节点上升为父节点[^3]; 3. **组合调整**:如插入时可能需多次旋转+变色(如“红-黑-红”结构调整为全黑)。 #### 三、与AVL树的对比 - **平衡标准**:AVL树要求左右子树高度差≤1,而红黑树允许一定程度的不平衡,但通过特性4限制树高; - **调整频率**:AVL树插入/删除后需频繁调整,红黑树调整次数更少,综合性能更优[^5]; - **适用场景**:红黑树适合频繁修改的数据集(如内存数据库),AVL树适合读多写少的场景[^1]。 #### 四、应用场景 红黑树广泛应用于需要高效动态数据管理的场景: - **编程语言库**:如Java的`TreeMap`、C++ STL的`map`和`set`; - **文件系统**:如Ext3/Ext4的目录索引; - **实时计算**:保证操作时间稳定性的任务调度。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值