学习过2-3树之后就知道应怎样去理解红黑树了,如果直接看「算法导论」里的红黑树的性质,是看不出所以然。我们也看看一颗二分搜索树满足红黑的性质:

1.每个节点或是红色的,或是黑色的;

2.根节点是黑色的;

3.每个叶子节点(NIL)是黑色的;

4.如果一个节点是红色的,则它的两个子节点都是黑色的;

5.对每个节点,从该节点到其所有后代叶子节点的简单路径上,均包含相同数目的黑色节点。

如果说前面4个还算理解,那第5个性质又是怎么去理解呢?此时我们借着2-3树去理解基本的红黑树,当然我会在后几篇文章介绍2-3-4树以及基于2-3-4树的红黑树。

抛开上面二分搜索树满足红黑的性质,我们知道2-3树不是二叉树,我们把它转换成一颗二叉树,2-节点很好转,3-节点转二叉却有两种,如下图:

红黑是指被指向节点的链接颜色,对于一颗2-3树,因为3-节点的存在有很多不同的二叉树的表示,所以我们只考虑左倾的情况。

左倾红黑树和2-3树等价的定义

红黑树的定义是含有红黑链接并满足下列条件的二分搜索树:

1.红链接均为左连接;

2.没有任何一个节点同时和两条红链接相连;

3.该树是完美黑色平衡的,即任意空链接到根节点的路径上的黑链接数量相同(和2-3树等价的,任意节点到其叶子节点的高度都是相同的)。

因为2-3树不存在永久的4-节点,4-节点终归要分解的(在2-3-4树中,为了更好地插入和删除,4-节点只存在于叶子节点,非叶子节点和2-3树一样的),所以在2-3树中没有任何一个节点能同时和两条红链接相连。对于第3条,2-3树本身是绝对平衡的,将3-节点转成二叉只增加了左红链接,其他黑链接没有什么变化,依然是黑色平衡的。

查找元素

查找命中和二分搜索树一样,从根节点开始,如果查找命中则返回,否则比它小的进行左递归查找,比它大的进行右递归查找,直到查找为空。

写插入元素和删除元素之前,还是要先介绍一下旋转和颜色转换。

旋转

在插入或者删除操作中可能会出现右倾或者两条连续的红链接,在向上变换的过程中(恢复)都要调整为左倾。

假设有一条红色的右链接需要转为左链接,如下图所示:

这个操作叫做左旋转,右链接变成左链接,意味着被红链接指向的节点会变成红色,根节点默认是黑色。

右旋转也一样,不过在左倾红黑树中,只有出现两条连续红色的左连接才会进行右旋转,如下图:

Code:左旋转和右旋转

颜色转换

颜色转换是用在临时4-节点上的,不管是向下变换还是向上变换。

Code:颜色转换

插入元素

插入元素也需要先进行查找命中,查找未命中则在此节点(NIL)插入一个元素,是在红黑树底下插入一个红色节点,插入元素默认是红色节点。

如果红黑树目前是一颗空树,可以直接存储一个元素作为节点,然后该节点变成黑色。如果不是一颗空树,插入元素分两种情况:向2-节点插入新元素和向3-节点插入新元素。

向2-节点插入新元素有两种情况

向2-节点插入新元素很简单,如果新元素小于父节点的元素,直接插入红色的节点即可;如果新元素大于父节点的元素,则产生一个红色右链接,插完之后进行向上变换,在向上变换的过程中(修复红黑树的性质)需要进行左旋转,将右链接变成左链接,满足左倾红黑树的性质。

向3-节点插入新元素有三种情况

1.新元素小于3-节点最小值

2.新元素位于3-节点最小值和最大值之间

3.新元素大于3-节点最大值

插入元素只有向上变换的过程,目的是为了满足红黑性质。

动画:插入节点

算法动画地址:B站

Code:插入元素

删除元素

删除元素既有向下变换也有向上变换:向下变换是为了树底下有一个被红链接指向的节点可以被删除,不影响黑色平衡;向上变换是为了修复基于2-3树的左倾红黑树。

Code:向上变换(修复调整)

删除元素有4个原则:

1.删除元素的当前节点不能是2-节点;

2.向下变换不为2-节点;

3.从树底部删除节点;

4.向上变换,消除右倾和4-节点。

删除元素借鉴了之前学的二分搜索树删除元素的思想,二分搜索树删除元素分为删除最小元素、删除最大元素和删除任意元素三种情况:删除最小元素是一直递归它的左孩子,直到左孩子为空才进行删除;删除最大的元素则相反;如果是删除任意的元素需要进行命中查找,找到了就取右子树的最小值替换掉待删除元素,然后进行右子树的删除最小元素。

红黑树删除元素也是一样的,不过是多了向下变换和向上变换的过程。因为是左倾红黑树,删除最小元素是最合适的。

删除最小元素

「算法4」里的红黑树介绍了删除最小键这一小节,虽没有很详细地介绍,但给出了沿着左链接向下变换的三种情况:

1.如果当前节点(父节点位置)的左子节点不是2-节点,完成;

2.如果当前节点(父节点位置)的左子节点是2-节点而左子节点的兄弟节点不是2-节点,则左子节点借它的兄弟节点的一个键过来;

3.如果当前节点(父节点位置)的左子节点和左子节点的兄弟节点都是2-节点,将左子节点、当前节点和左子节点的兄弟节点合并成一个临时的4-节点,使当前节点由3-节点变成2-节点或则4-节点变成3-节点。

Code:moveRedLeft

删除最大节点思路也是一样的,不过这是左倾红黑树,对删除最大节点益处不大,甚至向下转换的时候左倾调整为右倾,向上转换balance还要将右倾调整为左倾。

动画:删除最小元素

算法动画地址:B站

Code:删除最小元素

删除任意元素

在前面学习了删除最小节点,删除任意节点自然就很简单了。我们如果要删除一个节点,首先进行命中查找,查找到这个待删除元素,将右子树的最小值替换掉这个待删除元素,指向待删除节点的链接颜色不能被改变。然后进行右子树的删除最小元素。

在命中查找过程中,需要沿着左链接或沿着右链接进行向下转换。前面删除最小元素就是沿着左链接向下转换的。

沿着右链接向下转换也分三种情况:

1.如果当前节点(父节点位置)的右子节点不是2-节点,将左倾转换成右倾;

2.如果当前节点(父节点位置)的右子节点是2-节点而右子节点的兄弟节点不是2-节点,则右子节点借它的兄弟节点的一个键过来;

3.如果当前节点(父节点位置)的右子节点和右子节点的兄弟节点都是2-节点,将右子节点、当前节点和右子节点的兄弟节点合并成一个临时的4-节点,使当前节点由3-节点变成2-节点或则4-节点变成3-节点。

Code:moveRedRight

Code:删除任意元素

动画:删除任意元素

算法动画地址:B站

阅读原文可查看算法4里的RedBlackTree.java源码

点击源码

喜欢本文的朋友,欢迎关注公众号「算法无遗策」,收看更多精彩内容

动画 | 什么是红黑树?(与2-3树等价)相关推荐

  1. 为什么HashMap使用红黑树而不使用AVL树

    在Jdk1.8版本后,Java对HashMap做了改进,在链表长度大于8的时候,将后面的数据存在红黑树中,以加快检索速度. 那么很多人就有疑问为什么是使用红黑树而不是AVL树,AVL树是完全平衡二叉树 ...

  2. 遍历HashMap源码——红黑树原理、HashMap红黑树实现与反树型化(三)

    本章将是HashMap源码的最后一章,将介绍红黑树及其实现,HashMap的remove方法与反树型化.长文预警~~ 遍历HashMap源码--红黑树原理.HashMap红黑树实现与反树型化 什么是红 ...

  3. 面试题:为什么用红黑树不用普通的AVL树

    在Jdk1.8版本后,Java对HashMap做了改进,在链表长度大于8的时候,将后面的数据由链表改为了存在红黑树中,以加快检索速度. 有疑问为什么是使用红黑树而不是AVL树,AVL树是完全平衡二叉树 ...

  4. 动画演示!红黑树解析

    红黑树动图解析 一.啥是红黑树? 红黑树(Red Black Tree) 是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组.因此想要弄清楚红黑树,我们需要先解决几个 ...

  5. B树,B+树,红黑树应用场景AVL树,红黑树,B树,B+树,Trie树

    B B+运用在file system database这类持续存储结构,同样能保持lon(n)的插入与查询,也需要额外的平衡调节.像mysql的数据库定义是可以指定B+ 索引还是hash索引. C++ ...

  6. 为什么HashMap使用红黑树而不是AVL树或者B+树

    红黑树和AVL树都是最常用的平衡二叉搜索树. 但是,两者之间有些许不同: AVL树更加严格平衡,因此可以提供更快的査找效果.因此,对于查找密集型任务使用AVL树没毛病. 但是对于插入密集型任务,红黑树 ...

  7. 从2-3-4树谈到Red-Black Tree(红黑树)

    从2-3-4树谈到红黑树 译者:July. 出处:http://blog.csdn.net/v_JULY_v . 在上一篇文章--从B树.B+树.B*树谈到R 树里已提到2-3-4树,那么本文,咱们就 ...

  8. 【算法】红黑树-二叉树-算法

    红黑树-二叉树-算法 红黑树查找_百度搜索(5 条消息)AVL树,红黑树,B树,B+树,Trie树都分别应用在哪些现实场景中? - 知乎查找(二):彻底理解红黑树和平衡查找树 - @瞪着太阳的乌鸦 - ...

  9. 红黑树( 图解 + 秒懂 + 史上最全)

    文章很长,建议收藏起来慢慢读!疯狂创客圈总目录 语雀版 | 总目录 码云版| 总目录 博客园版 为您奉上珍贵的学习资源 : 免费赠送 :<尼恩Java面试宝典>持续更新+ 史上最全 + 面 ...

  10. 美团实习面试:熟悉红黑树是吧?能不能写一下?

    点击关注公众号,Java干货及时送达 手写红黑树确实有点过分了,但我觉得写不出来也正常,只要理解就行 红黑树是数据结构中比较复杂的一种,最近与它交集颇多,于是花了一周的空闲时间跟它死磕,终于弄明白并实 ...

最新文章

  1. 分区视图(转自小春BOOK)
  2. 服务器 | 种类及区别
  3. 中国电子银行网 神策数据:银行数字营销现状洞察报告
  4. 2.4操作系统之死锁详解(预防、避免、检测、解除)+思维导图
  5. Redis实战(三):Redis的List、Set、Hash、sorted_set、skip list
  6. Linux查看系统cpu个数、核心数、线程数
  7. canvas 绘制直线 并选中_在画布中使用路径-Canvas的基本操作
  8. STM32常见错误error: #268: declaration may not appear after executable statement
  9. 在PyCharm环境下使用Jupyter Notebook
  10. 为VMware虚拟机内安装的Ubuntu 16.04设置静态IP地址
  11. 【ElementUI样式优化】el-input带自定义查询删除图标 ==> 图标点击可实现对应功能 ==> 一个input实现查询重置功能
  12. WinXP如何自动清理Temp文件夹
  13. 记一次阿里云面试心得
  14. JAVA常用类之日期处理
  15. python在线查题_知到题目在线答案查询
  16. mysql datasource property_spring配置datasource三种方式
  17. 190403内置模块
  18. Defender绝密档案:惊现中本聪?
  19. 阿松嘚嘚嘚-数据库篇2-完美范式不完美
  20. Java中常用的Dos命令

热门文章

  1. C语言墓碑上的字符,古代人墓碑上的文字都有什么讲究
  2. apkg格式怎么打开_jpg怎么转换成pdf?再不学就晚了!
  3. 计网习题总结,附答案
  4. 银行卡四要素API 方便好用
  5. 微位科技李子阳:哈耶克—未来的价值单位
  6. 读书感受 之 《穷查理宝典》
  7. 计算机访问网络延迟越低越好吗,内存延迟参数是否越低越好
  8. 华为、腾讯、百度等大厂投入,汇医慧影奔赴海外  AI+CT新业态起飞
  9. MiniUtilityFramework 九 CText和TEXT
  10. Skew Heaps