什么是红黑树 ,你懂了吗

每次找工作面试八股文肯定少不了,集合就是其中一个,map集合中问的最多的就是hashMap和ConcurrentHashMap两个了。这两个集合在1.8之后就使用到了红黑树,所以这篇文章主要介绍的是红黑树,把红黑树搞懂再去看hashmap和concurrentHashMap就会发现很简单,根本不用每次面试都要去死记硬背,过不了几天就忘了。

首先关于树的概念就不介绍了,二叉查找树我们都知道左子节点<根节点<右节点,使用这种结构来查找一个数就很快;但如果出现了一些极端情况就不那么快了,比如下面的情况:

什么是红黑树 ,你懂了吗

极端二叉查找树

如果出现了上图的这种数,那么时间复杂度就变成了O(n)。为了解决这种情况可以使用平衡二叉树;平衡二叉树也是二叉查找树,只不过平衡二叉树多了一个条件:左子树和右子树差的绝对值不大于1。平衡二叉树的实现方式有很多,红黑树就是其中一种

红黑树的特性

根据一张图来说红黑树的特性:

什么是红黑树 ,你懂了吗

红黑树结构

  • 每个节点不是黑色就是红色
  • 根节点是黑色的
  • 每个叶子节点(NIL)是黑色的。这里没有画出来,就是2、5、7、9每个节点下面还各有两个NIL的叶子节点,而我们操作的只到2、5、7、9
  • 两个红色节点不可相连(即两个红色节点不能是父子节点)
  • 任意一个节点到每个叶子节点的路径都包含相同数量的黑色节点(比如4到叶子节点的黑色数量是2,8也是)

红黑树并不是一个完美的平衡二叉树,红黑树可以做到自平衡靠的是变色、左旋、右旋三种方式

变色:理解很简单,就是红色变黑色,黑色变红色

左旋&右旋:对于左旋和右旋大多解释得很拗口,反正我是听不懂,我放一张图来解释

什么是红黑树 ,你懂了吗

红黑树左旋&右旋

上面一张动态图就表示了红黑树的左旋和右旋,看图就可以一目了然。接下来就挨个分析。

左旋

什么是红黑树 ,你懂了吗

左旋

根据这个图说左旋的步骤:

1)将y的左子树(如果不为空)的父节点指向x,x的右子树指向y的左子树

2)如果x的父节点不为空,将y的父节点指向x的父节点,并将x的父节点指向y

3)将x的父节点指向y,将y的左子树指向x

备注:上图中的P是一个树结构,在第二点中将x的父节点指向y时,需要判断x在父节点的左子树上还是右子树上:如果是左子树:x.parent.left = y;如果是右子树:x.parent.right = y;

右旋

什么是红黑树 ,你懂了吗

右旋

根据这个图说右旋的步骤:

1)将y的左子树指向x的右子树,并将x的右子树(如果不为空)的父节点指向y

2)如果y的父节点不为空,将x的父节点指向y的父节点,将y的父节点指向x

3)将x的右子树指向y,将y的父节点指向x

备注:和左子树的旋转是一样的,在第二点“将y的父节点指向x”,需要判断y是P的左子树还是右子树,如果是左子树:y.parent.left = x;如果是右子树:y.parent.right = x;

知道了红黑树的基本操作,那么就会有疑问:这三种操作分别是什么时候进行呢?

在这之前需要知道一个前提:每插入一个数据时,默认的颜色是红色!

红黑树操作场景:

1)如果树结构为空,将插入的节点颜色改为黑色

2)如果插入节点的父节点是黑色,那就说明都不用问,直接挂在父节点的左子树或者右子树上即可

3)如果插入节点的父节点是红色

3.1)如果插入节点存在叔叔节点并且为红色(父节点和叔叔节点都是红色),将父节点和叔叔节点改为黑色,祖父节点改为红色,然后以祖父节点为当前节点进行下一轮处理(即以祖父节点为当前节点再次从第一点开始)

3.2)如果叔叔节点不存在或者叔叔节点为黑色

3.2.1)父节点是祖父节点的左子树

3.2.1.1)插入的节点在父节点的左子树上(LL双红),将父节点改为黑色,祖父节点改为红色,以祖父节点为当前节点进行右旋

3.2.1.2)插入的节点在父节点的右子树上(LR双红),以父节点进行左旋,这样就会得到LL双红的情景(得到3.2.1.1的情景),然后以父节点为当前节点进行下一轮处理(即从第一点开始)

3.2.2)父节点是祖父节点的右子树

3.2.2.1)插入的节点在父节点的右子树上(RR双红),将父节点改为黑色,祖父节点改为红色,以祖父节点进行左旋

3.2.2.2)插入的节点在父节点的左子树上(RL双红),以父节点进行右旋,这样就得到了RR双红的情况,然后以祖父节点进行下一轮处理

说了这么多的文字是不是搞迷糊了,接下来会使用一张图结合上面的文字来说红黑树的自平衡。

什么是红黑树 ,你懂了吗

红黑树插入

上面的图是一个红黑树,现在需要插入一个19,首先根据BST的规则,19应该放在20的左子树上,对照上面的规则3进行匹配发现是符合3.1的:父节点和叔叔节点都是红色,那么就根据这个规则进行调整:父节点和叔叔节点改为黑色,祖父节点改为红色,以祖父节点为当前节点进行下一轮的处理:

什么是红黑树 ,你懂了吗

根据3.1规则进行调整

以22为节点再次从第一点开始进行匹配,发现匹配到了3.2.1.2,就以18进行左旋

什么是红黑树 ,你懂了吗

以18进行左旋

上图是左旋之后的结果,然后再以18位节点从第一点开始验证匹配,发现匹配到了3.2.1.1,根据这个规则,将父节点22改为黑色,祖父节点25改为红色,然后以25为节点进行右旋

什么是红黑树 ,你懂了吗

以25进行右旋

以25进行右旋的结果,然后再看这颗红黑树是不是就调整完了,至于3.2.2中的情况,可以自己画图尝试下。我觉得学数据结构和算法的东西一定要动手练,动手画,如果只是凭自己看,就很容易出现眼高手低。甩开这些内容自己去想或者过几天再想整个过程的时候能不能想的起来。

红黑树的代码我这就不贴了。后面会介绍在删除的时候是如何保证红黑树的自平衡以及hashmap中使用红黑树的情况

学习Java集合框架是学习数据结构最好的教材,同样设计模式也是。Java源代码把设计模式用到了极致(个人的一些见解)

  • 本文分类:知识大全
  • 本文标签:无
  • 浏览次数:73 次浏览
  • 发布日期:2024-01-28 16:32:23
  • 本文链接:http://www.liekang.com/286194.html
  • 上一篇 > 甲骨文的发现,意义有多大?
  • 下一篇 > 吉隆坡是哪个国家——马来西亚吉隆坡
本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至907991599@qq.com 举报,一经查实,本站立即删除。本文作者:小稿,如若转载,请注明出处:http://www.diehen.com/435664.html
(0)
小稿的头像小稿
上一篇 2024年8月12日 下午1:52
下一篇 2024年8月12日 下午1:53

相关推荐

  • 多肉有多少个品种名称(最常见的多肉植物)

    多肉的品种实在太多了,虽然它们都叫多肉,真养起来习性还是有所不同,就拿大家最常见的一些品种来说,可以简单分为6种,养护方法也不一样,放一起养的时候要区分开来哦~养不死的多肉第一种是养不死的多肉,这类多肉基本上可以随便养,扔角落里不管都能长好,属于入门级的品种。这类多肉有:冬美人、…

    2023年12月1日
  • 绿幽灵等级划分及挑选要点指南:如何购买到上等绿幽灵?

    绿幽灵,作为水晶大家族中独特的异象水晶,因其内部包含的绿色矿物质而得名,深受水晶爱好者的青睐。在选购绿幽灵时,了解其等级划分的标准至关重要。绿幽灵的等级取决于其晶体内包含物的类型和…

    2024年7月9日
  • 豪华邮轮游5天多少钱2023,预算1万到10万元(费用与房间档次有关)

    每到放长假的时候,总是会有很多人相约一起出去旅游,不少家庭还会选择邮轮旅游,那么有些做攻略的小伙伴就想知道豪华邮轮游5天多少钱?跟着小编脚步一起往下看看吧。豪华邮轮游5天多少钱1.内舱6人房,上铺5480元/人,下铺5680元/人;2.海景6人房,上铺5780元/人,下铺5980元/人;3.高…

    2023年10月17日
  • 怎么鉴别玉镯子的真假,怎么鉴定玉镯的真假

    就让朋友去查查证书编号是否存在?不仅私营机构打着专业鉴定中心的名号发放信息不实的鉴定证书,但是这个比较难伪造的是证书的钢印,本人伪造各种耳不熟不能详的检测机构来出据本人制造的证书,…

    2023年9月19日
  • 数码宝贝的游戏大全 2024高人气的数码宝贝游戏盘点

    大家小时候在电视上看数码宝贝时,是否有想象过自己也拥有一只数码宝贝呢?为了实现大家童年时的梦想,小编为大家盘点了数码宝贝的游戏大全。现在,大家可以在游戏中再次追寻那份童年的梦想,与…

    2024年3月23日
  • 人类至今有多少年的历史了呢,人类至今已有多少年的历史了

      人类至今有多少年的历史了呢,人类至今已有多少年的历史了是根据科学家测算,宇宙的年龄大约是150亿年的。  关于人类至今有多少年的历史了呢,人类至今已有多少年的历史了以及人类至今有多少年的历史了呢,人类至今有多少年的历史了英语,人类至今已有多少年的历史了,人类至今有多少年历史百度百科,人类已经…

    投稿 2023年11月26日
  • 山的笔顺(山字的笔顺和写法)

    山的笔顺(山字的笔顺和写法) 笔顺编码 252 笔顺笔画 丨フ丨 笔顺名称 竖 竖折/竖弯 竖 写法 山字共有3画,笔顺(笔画顺序)为:竖,竖折/竖弯,竖 汉字 山 读音 shān…

    2023年12月25日
  • 如何进入Win10系统安全模式【띲띪띺띧⣼】

    更新Win11系统需要先在Win10系统进入安全模式后才能更新。那么如何进入安全模式Win10系统呢?让我们一起来看看吧! 打开“开始菜单” 首先打开“开始菜单”,点击“电源”选项…

    投稿 2024年3月31日
  • 擦完粉底液脸上起皮怎么处理,擦完粉底液脸上起皮怎么办

      擦完粉底液脸上起皮怎么处理,擦完粉底液脸上起皮怎么办粉底液是我们化妆都会用到的一种底妆产品,我们在画底妆之前需要做好皮肤的保湿工作,选择适合自己的底妆产品,正确上妆才能有最好的妆效的。  关于擦完粉底液脸上起皮怎么处理,擦完粉底液脸上起皮怎么办以及擦完粉底液脸上起皮怎么办,粉底液上脸起皮如何…

    投稿 2023年11月25日
  • 五只小猫摇头表情包动图,五只小猫摇头表情包动图可爱

      五只小猫摇头表情包动图,五只小猫摇头表情包动图可爱《乘风破浪的姐姐》主题曲无价之姐在网络上传唱,一起火的还有五只猫摇头,点头的表情包动图,非常适合应援,跟随者五只小猫满脑袋摇咿摇咿摇咿摇咿摇,下面滚锁常识小编带来:五只小猫摇头表情包动图无价之姐主题曲摇头表情包的。  关于五只小猫摇头表情包…

    投稿 2023年11月22日