前戏

红黑树,对很多童鞋来说,是既熟悉又陌生。熟悉是因为在校学习期间,准备面试时,这是重点。然后经过多年的荒废,如今已经忘记的差不多了。如果正在看文章的你,马上快要毕业,面临着找工作的压力;又或者你觉得需要将这块知识重新复习一遍;又或者只是看看,那么恭喜你,赚到了。那么我将带领大家重新认识下红黑树,用简单的语言,搞懂红黑树。

在学习红黑树之前,咱们需要先来理解下二叉查找树(BST)。

二叉查找树

要想了解二叉查找树,我们首先看下二叉查找树有哪些特性呢?

1, 左子树上所有的节点的值均小于或等于他的根节点的值

2, 右子数上所有的节点的值均大于或等于他的根节点的值

3, 左右子树也一定分别为二叉排序树

我们来看下图的这棵树,他就是典型的二叉查找树

那问题来了,为什么一定要这种结构呢?换句话说这样的结构有什么好处呢?我们就来查找下值为10的节点。它怎么一步步的找到这个节点的?步骤是怎样的?接着往下看。

1, 查找到根节点9,看下图:

2, 由于10大于9的,所以查找到右孩子13,看下图:

3, 又因为10是小与13的,所以查找到左孩子11,看下图:

4, 这一步相比不用说了大家也都知道了,找到了左孩子,然后发现正好是10 。恰好是正要寻找的值。

可能又有童鞋会问,这不是二分查找的思想吗?确实,查找所需的最大次数等同于二叉查找树的高度。当然在插入节点的时候,也是这种思想,一层一层的找到合适的位置插入。但是二叉查找树有个比较大的缺陷,而且这个缺陷会影响到他的性能。我们先来看下有一种情况的插入操作:

如果初始的二叉查找树只有三个节点,如下图:

我们依次插入5个节点:7,6,5,4,3,。看下图插入之后的图:

看出来了吗?有没有觉得很别扭,如果根节点足够大,那是不是“左腿”会变的特别长,也就是说查找的性能大打折扣,几乎就是线性查找了。

那有没有好的办法解决这个问题呢?解决这种多次插入新节点而导致的不平衡?这个时候红黑树就登场了。

红黑树

红黑树就是一种平衡的二叉查找树,说他平衡的意思是他不会变成“瘸子”,左腿特别长或者右腿特别长。除了符合二叉查找树的特性之外,还具体下列的特性:

1. 节点是红色或者黑色

2. 根节点是黑色

3. 每个叶子的节点都是黑色的空节点(NULL)

4. 每个红色节点的两个子节点都是黑色的。

5. 从任意节点到其每个叶子的所有路径都包含相同的黑色节点。

看下图就是一个典型的红黑树:

很多童鞋又会惊讶了,天啊这个条条框框也太多了吧。没错,正式因为这些规则,才能保证红黑树的自平衡。最长路径不超过最短路径的2倍。

当插入和删除节点,就会对平衡造成破坏,这时候需要对树进行调整,从而重新达到平衡。那什么情况下会破坏红黑树的规则呢?

1,我们看下图:

向原来的红黑树插入值为14的新节点,由于父节点15是黑色节点,所以这种情况没有破坏结构,不需要做任何的改变。

2,向原树插入21呢?,看下图:

由于父节点22是红色节点,因此这种情况打破了红黑树的规则4,必须作出调整。那么究竟该怎么调整呢?有两种方式【变色】和【旋转】分为【左旋转】和【右旋转】。

【变色】:

为了符合红黑树的规则,会把节点红变黑或者黑变红。下图展示的是红黑树的部分,需要注意节点25并非根节点。因为21和22链接出现红色,不符合规则4,所以把22红变黑:

但这样还是不符合规则5,所以需要把25黑变红,看下图:

你以为现在结束了?天真,因为25和27又是两个连续的红色节点(规则4),所以需要将27红变黑。

终于结束了,都满足规则了,舒服多了。

【左旋转】

也就是逆时针旋转两个节点,使父节点被自己的右孩子取代,而自己成为自己的左孩子,听起来吓死人,直接看图吧:

【右旋转】

顺时针旋转两个节点,使得自己的父节点被左孩子取代,而自己成为自己的右孩子,看不懂直接看图吧:

看起来这么复杂,到底怎么用呢?确实很复杂,我们讲下典型的例子,大家参考下:

以刚才插入21节点的例子:

首先我们需要做的是变色,把节点25以及下方的节点变色:

由于17和25是连续的两个红色节点,那么吧节点17变黑吗?这样是不行的,你想这样一来不就打破了规则4了吗,而且根据规则2,也不可能吧13变成红色。变色已经无法解决问题了,所以只能进行旋转了。13当成X,17当成Y,左旋转试试看:

由于根节点必须是黑色,所以需要变色,结果如下图:

继续,其中有两条路径(17-)8->6->NULL)的黑色节点个数不是3,是4不符合规则。

这个时候需要把13当做X,8当做Y,进行右旋转:

最后根据规则变色:

这样一来,我们终于结束了,经过调整之后符合规则。

那我们费这么大力气,这么复杂,这东西用在哪里,有哪些应用呢?

其实STL中的map就是用的红黑树。

红黑树是什么?红黑树的作用?红黑树的调整?相关推荐

  1. 红黑树中nil结点_什么是红黑树?程序员面试必问!

    点击上方java小组,选择"置顶公众号" 优质文章,第一时间送达 当在10亿数据中只需要进行10几次比较就能查找到目标时,不禁感叹编程之魅力!人类之伟大呀! -- 学红黑树有感. ...

  2. 红黑树的删除_从红黑树的本质出发,彻底理解红黑树!

    前言 早上好,我是彤哥. 上一节,我们一起从二叉树.二叉查找树.平衡树.AVL树.2-3树.2-3-4树.B树,一路讲到红黑树,最后得出红黑树的本质:红黑树就是2-3-4树,请看下图: 我们知道2-3 ...

  3. HashMap底层红黑树实现(自己实现一个简单的红黑树)

    文章整理于小刘老师讲源码 视频学习链接:小刘老师讲解红黑树 JDK集合源码之HashMap解析(上) JDK集合源码之HashMap解析(下) 1.树结构入门 1.1 什么是树? 树(tree)是一种 ...

  4. 红黑树:节点插入详解及其红黑树自我实现

    红黑树:节点插入详解及其红黑树自我实现 红黑树的四个性质: 每个结点不是红色就是黑色 根节点是黑色的 如果一个节点是红色的,则它的两个孩子结点是黑色的 对于每个结点,从该结点到其所有后代叶结点的简单路 ...

  5. java 红黑树用法_女朋友学数据结构:红黑树

    前言 红黑树的本质:红黑树就是2-3-4树,请看下图: 我们知道2-3-4的插入.删除.查找元素的原理是相当简单的,那么,我们是不是可以利用2-3-4树来记忆红黑树呢? 答案是肯定的,本节,我们就来看 ...

  6. 从红黑树的本质出发,彻底理解红黑树!

    前言 早上好,我是彤哥. 上一节,我们一起从二叉树.二叉查找树.平衡树.AVL树.2-3树.2-3-4树.B树,一路讲到红黑树,最后得出红黑树的本质:红黑树就是2-3-4树,请看下图: 我们知道2-3 ...

  7. 红芯丑闻揭秘者 Touko 专访 | 关于红芯丑闻的更多内幕……

    专栏 | 九章算法 网址 | www.jiuzhang.com ❤ 红芯事件 近日,一则<自主研发的国产浏览器内核,红芯宣布获2.5亿C轮融资>的讯息再次将"国产自主创新&quo ...

  8. 为什么手机玩我的世界进服务器会显示红字,LOL进去时显示的蓝红标志是什么 | 手游网游页游攻略大全...

    发布时间:2016-08-10 在封神宫一层分别有3个机关~需要黄蓝红三种宝珠各3个,才能开启后面的机关. 就在图的左上角,直接点击机关就会自动镶嵌宝珠到机关上,会有动画显示墙壁升起,走进去墙壁后的区 ...

  9. 深度:怎样打造中老年网红?爆款抖音老年网红的发展模式、现状与机会

    ||三年前的微信与当下的抖音:中老年流量新红利 每一次新媒体平台的崛起都带来重构流量格局的巨大机会,而且中老年群体相比年轻人进入新平台会有一个时间差,掌握好这个节奏就意味着对中老年用户流量更精准的把握 ...

  10. 网红探店一般怎么收费?找网红探店该如何筛选博主

    很多商家在宣传店铺时需要想通过网络传播的方式为店铺带来热度与关注,网红探店就是其中一种.那么今天就和大家介绍一下网红探店一般怎么收费,找网红探店该如何筛选博主. 一.网红探店一般怎么收费? 一些想要对 ...

最新文章

  1. 关于虚拟机的三种网络接口模式(以VXBOX虚拟机为例)
  2. (004)RN开发VSCode调试ReactNative项目
  3. STM32 基础系列教程 35 - Lwip_sntp
  4. pycharm安装怎么选_客厅窗帘怎么选 客厅窗帘怎么安装好看
  5. 【Python】Python的类和对象(长文系列第⑤篇)
  6. deb 安装_本地安装DEB包的3种命令行工具(适合Ubuntu和Deepin )
  7. 黑马-程序员C#泛型简介
  8. nib和xib的区别
  9. 不学spring其他,直接学spring boot
  10. 走在网页游戏开发的路上
  11. php设计模式-责任链模式
  12. ftp文件推送 linux_Linux 终端访问 FTP 及 上传下载 文件
  13. Android 市场的未来
  14. 视觉/视觉惯性SLAM最新综述:领域进展、方法分类与实验对比
  15. 基于SSH+MySQL+Bootstrap的高校实验室预约管理系统
  16. 一种利用百分比布局适配所有Android手机屏幕分辨率的方法
  17. 详细介绍各种常见格式的图片
  18. (GPU) Intel 服务器独立GPU SG1 - H3C XG310试用
  19. 曝光,程序员大佬们的的 10 个摸鱼神器
  20. Html5或者类似方案将会大行其道

热门文章

  1. 计算机毕业设计ssm垃圾回收系统j16l0系统+程序+源码+lw+远程部署
  2. 关于“视口”与“窗口”
  3. 毕业设计游戏商城项目
  4. Micro微分销_手机APP商城源码研发
  5. EMBoss业务支撑平台
  6. 水利RTU 水文监测系统的利器
  7. Java---设计【家电销售管理系统】
  8. 宇视录像机实况画面不固定,出现实况画面不断变化
  9. 安卓手机部署分割模型
  10. Delphi 7启动后提示Unable to rename delphi32.dro的解决办法