第十三章 红黑树

首先说一下本章有一个地方的图有误,P168页的图,正确的图如下(case3有误,中文版):

在Linux内核和STL中,都大量使用了红黑树这种数据结构,原因是红黑树的搜索、插入和删除效率都很高。

红黑树是一种二叉查找树,但在每个结点上增加一个存储位表示结点的颜色,可以是RED(红色)或BLACK(黑色)。

一棵红黑树有如下性质:

(1)每个结点要么是红的,要么是黑的。
(2)根结点是黑的。
(3)每个叶结点,即空结点(NIL)是黑的。
(4)如果一个结点是红的,那么它的俩个儿子都是黑的。
(5)对每个结点,从该结点到其子孙结点的所有路径上包含相同数目的黑结点。

树中每个结点有五个域:color,key,left,right和p。一棵有n个内结点的红黑树的高度至多为2lg(n+1)。

红黑树的操作:

1、旋转

当在红黑树上进行插入或删除操作时,树的红黑性质将被破坏。为了保持这些性质,就要改变树中某些结点的颜色及指针的结构。其中指针结构的修改是通过旋转来完成的。旋转是一种能保持持树中结点的中缀次序的局部操作。下图是两种旋转方法,左旋和右旋。

2、插入

情况1:如下图所示,X为新插入的结点,将其涂为红色。P为X的父结点,也为红色。G是X的祖父结点,S是X的叔父结点,它们都为黑色。这时X、P和G成一直线排列,此种情况的处理方式比较简单,只要采用一个单旋转操作,并进行适当的颜色调整即可。首先进行一个右单旋转,然后修改G的颜色。

情况2:如下图所示,X为新插入的结点,将其涂为红色。P为X的父结点,也为红色。G是X的祖父结点,S是X的叔父结点,它们都为黑色。这是X、P和G成一折线排列,此种情况的处理方式是采用一个双旋转操作,并进行适当的颜色调整即可。首先进行一个先左后右的双旋转,旋转过程中修改X和G的颜色。

情况3:情况1和情况2都相对简单,但是如果新插入结点X的叔父结点S为红色,有可能无论如何旋转总是会出现“红-红结点”的情况。这时采用逐层上升的调整和着色。

如下图所示的情况,仍然比较简单,一个右单旋转就解决了问题。

下图所示的情况则复杂一些。图a为插入结点16的过程。因为16及其父结点17都是红的,帮违反了性质3。又因为16的叔父结点22也是红的,则属于情况3。各结点被重新着色,指针沿树上升,所得的树如下图b所示。如此,结点21及其父亲结点又都为红色,但结点21的叔父结点30是黑的。由于21是15的右孩子,故可应用情况2进行处理,在执行一次左旋转后,所得结果树如图c。执行一次右旋后得图d中的树。它是一棵合法的红黑树,插入操作完成。

 

《算法导论》CLRS算法C++实现(十一)P163 红黑树相关推荐

  1. 算法导论第三版第十一章11.1-4

    算法导论第三版第十一章11.1-4 我们希望在一个非常大的数组上,通过利用直接寻址的方式来实现一个字典.开始时,该数组中可能包含一些无用信息,但要堆整个数组进行初始化时不太实际的,因为该数组的规模太大 ...

  2. 算法设计与分析_算法导论(CLRS)骨灰级笔记分享:目录

    倘若你去问一个木匠学徒:你需要什么样的工具进行工作,他可能会回答你:"我只要一把锤子和一个锯".但是如果你去问一个老木工或者是大师级的建筑师,他会告诉你"我需要一些精确的 ...

  3. 算法导论——A*算法易懂的证明

    算法导论--A*算法易懂的证明 前言 A* 证明 证明采用反证法,课上老师讲解不够清晰,课后自己下了点功夫,明白了A * 算法的原理. 前言 A*算法,其核心思想在于f(n)和Best-First.其 ...

  4. 算法导论 CLRS 第26章 最大流 Maximum flow C#

    2021/11/26 第六部分 图算法 第22章 基本的图算法 图数据结构设计 出度.入度和度 有向图 出度≠入度 先初始化出度,再初始化入度,u.入度=u.AdjList.length-u.out_ ...

  5. 算法导论——排序算法

    学习<算法导论>学习感受 转载于:https://www.cnblogs.com/xuddong/archive/2013/04/10/3012567.html

  6. 【算法】958- 动图演示:彻底理解红黑树?

    本文主要讲解下最近一直听到的红黑树,看看究竟是什么神 二叉树 满足以下两个条件的树就是二叉树: 本身是有序树(若将树中每个结点的各子树看成是从左到右有次序的(即不能互换),则称该树为有序树(Order ...

  7. 算法导论 CLRS 22.4-4 解答

    先说结论: 对于有环图,top排序不一定可以生成坏边最小的序列 证明: 1. 假设G至少需要去掉k条边才能变成无环图,则任意序列P的坏边数目bad[P] >= k: 证明: 如果存在P使得bad ...

  8. 算法导论 CLRS 23.3 解答 (未完成)

    a) T为G的一个最小生成树,(u,v)为T中的任意一条边,可以证明(u,v)是G中所有u--->v的路径中的最小的边, 反正法:假设u--->v的某条路径P中存在一条边(x,y)的权重小 ...

  9. 算法导论——贪心算法:哈夫曼编码(霍夫曼编码)

    2019独角兽企业重金招聘Python工程师标准>>> package org.loda.greedy;import org.junit.Test; import org.loda. ...

最新文章

  1. 7软件质量与测试规范
  2. 郭瑞东 | 如何制造更聪明的人工智能?让人工生命在复杂环境中进化
  3. 《WCF技术剖析(卷2)》目录
  4. (BFS)Prime Path (poj3126)
  5. Ubuntu 汉字显示一半的修复
  6. 选STM32还是51单片机,对于时间有什么要求
  7. 基于深度学习的身份证号码识别方法
  8. Description: Field smsClient in com.atguigu.gmall.pms.service.impl.SpuServiceImpl required a bean o
  9. 简单实现一个手持弹幕功能+文字抖动特效
  10. C# 通用方法MD5计算
  11. 文本框获取焦点后出现的边框,怎么去掉
  12. 论混合软件架构的设计
  13. unity 关于如何调整Canvas画布的大小
  14. 【Jenkins+青藤云】基于Jenkins部署青藤云镜像扫描插件(1)
  15. 读书点亮生活-教育成本
  16. Linux命令date日期时间和Unix时间戳互转
  17. C++阶段06笔记01【基于STL的演讲比赛流程管理系统】
  18. ios 滤镜处理(详细滤镜介绍)及处理方法
  19. 手机移动web页面的排版与布局一点经验(尺寸单位兼容行。)
  20. python篮球比赛预测数据分析统计服_用python基于2015-2016年的NBA常规赛及季后赛的统计数据分析...

热门文章

  1. 7K7K小游戏《黑客是怎样炼成的》攻略
  2. 支付宝钱包技术架构剖析
  3. 少儿Python编程6-计算机数据结构和算法
  4. vars()函数用法
  5. 思维误区:努力学习与有效学习!不要做无用功
  6. 极度的坦诚就是无坚不摧
  7. java-hiho1000A+B
  8. 挖掘机技术哪家强?--来这里看看吧!
  9. 不得不知道的搜索引擎使用技巧(思维导图版)
  10. 【原创】5.4青年有感