二叉查找树,红黑树

漫画算法:什么是红黑树?(适合初学红黑树小白简单易懂)

————————————

二叉查找树(BST)具备什么特性呢?

1.左子树上所有结点的值均小于或等于它的根结点的值。

2.右子树上所有结点的值均大于或等于它的根结点的值。

3.左、右子树也分别为二叉排序树。

下图中这棵树,就是一颗典型的二叉查找树:

1.查看根节点9:

2.由于10 > 9,因此查看右孩子13:

3.由于10 < 13,因此查看左孩子11:

4.由于10 < 11,因此查看左孩子10,发现10正是要查找的节点:

假设初始的二叉查找树只有三个节点,根节点值为9,左孩子值为8,右孩子值为12:

接下来我们依次插入如下五个节点:7,6,5,4,3。依照二叉查找树的特性,结果会变成什么样呢?

1.节点是红色或黑色。

2.根节点是黑色。

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

4 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)

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

下图中这棵树,就是一颗典型的红黑树:

什么情况下会破坏红黑树的规则,什么情况下不会破坏规则呢?我们举两个简单的栗子:

1.向原红黑树插入值为14的新节点:

2.向原红黑树插入值为21的新节点:

由于父节点22是红色节点,因此这种情况打破了红黑树的规则4(每个红色节点的两个子节点都是黑色),必须进行调整,使之重新符合红黑树的规则。

变色:

为了重新符合红黑树的规则,尝试把红色节点变为黑色,或者把黑色节点变为红色。

下图所表示的是红黑树的一部分,需要注意节点25并非根节点。因为节点21和节点22连续出现了红色,不符合规则4,所以把节点22从红色变成黑色:

但这样并不算完,因为凭空多出的黑色节点打破了规则5,所以发生连锁反应,需要继续把节点25从黑色变成红色:

此时仍然没有结束,因为节点25和节点27又形成了两个连续的红色节点,需要继续把节点27从红色变成黑色:

左旋转:

逆时针旋转红黑树的两个节点,使得父节点被自己的右孩子取代,而自己成为自己的左孩子。说起来很怪异,大家看下图:

图中,身为右孩子的Y取代了X的位置,而X变成了自己的左孩子。此为左旋转。

右旋转:

顺时针旋转红黑树的两个节点,使得父节点被自己的左孩子取代,而自己成为自己的右孩子。大家看下图:

图中,身为左孩子的Y取代了X的位置,而X变成了自己的右孩子。此为右旋转。

我们以刚才插入节点21的情况为例:

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

此时节点17和节点25是连续的两个红色节点,那么把节点17变成黑色节点?恐怕不合适。这样一来不但打破了规则4,而且根据规则2(根节点是黑色),也不可能把节点13变成红色节点。

变色已无法解决问题,我们把节点13看做X,把节点17看做Y,像刚才的示意图那样进行左旋转:

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

这样就结束了吗?并没有。因为其中两条路径(17 -> 8 -> 6 -> NIL)的黑色节点个数是4,其他路径的黑色节点个数是3,不符合规则5。

这时候我们需要把节点13看做X,节点8看做Y,像刚才的示意图那样进行右旋转:

最后根据规则来进行变色:

如此一来,我们的红黑树变得重新符合规则。这一个例子的调整过程比较复杂,经历了如下步骤:

变色 -> 左旋转 -> 变色 -> 右旋转 -> 变色

几点说明:

1. 关于红黑树自平衡的调整,插入和删除节点的时候都涉及到很多种Case,由于篇幅原因无法展开来一一列举,有兴趣的朋友可以参考维基百科,里面讲的非常清晰。

2.漫画中红黑树调整过程的示例是一种比较复杂的情形,没太看明白的小伙伴也不必钻牛角尖,关键要懂得红黑树自平衡调整的主体思想。

转载于:https://www.cnblogs.com/fengxf/p/10790832.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/449090.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在 CentOS 7上安装和使用 Docker Compose

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 介绍 Docker是一个很好的工具&#xff0c;但要真正充分利用它的潜力&#xff0c;最好是应用程序的每个组件都在它自己的容器中运行。对于…

WebSSH2安装过程可实现WEB可视化管理SSH工具

目录 Chrome web Secure Shell Extension gotty GateOne noVNCvncserver XtermjsSSH2nodejs nodejstty.js CheungSSH TriAquae https://github.com/Scirh/Python/tree/master/django https://www.smarthomebeginner.com/install-shellinabox-on-ubuntu/#64-bit https://gist.gi…

原码反码补码位运算,

进制转换&#xff1a; 十进制转二进制&#xff1a; 求余法&#xff1a;用2对数据求余&#xff0c;然后再对商继续求余&#xff0c;直到商为0结束&#xff0c;过程中产生的余数就是该数据的二进制(逆序)。 求权法&#xff1a;数据 - 2^(n-1) 如果可以减 第n位就是1&#xff0c;否…

一个人幸运的前提,是他有能力改变自己

很多时候&#xff0c;我们羡慕那些幸运的人&#xff0c;却看不到他们为此做出的努力和改变。 其实&#xff0c;一个人的幸运并不是偶然的&#xff0c;美国成功哲学家金洛恩说过这么一句话&#xff1a;“成功不是追求得来的&#xff0c;而是被改变后的自己主动吸引来的。” …

剑指Offer-正则表达式匹配(Python)

1 题干内容 请实现一个函数用来匹配包括.和*的正则表达式。模式中的字符.表示任意一个字符&#xff0c;而*表示它前面的字符可以出现任意次&#xff08;包含0次&#xff09;。 在本题中&#xff0c;匹配是指字符串的所有字符匹配整个模式。 例如&#xff0c;字符串aaa与模式a.a…

Docker 制作镜像的方式

其它制作镜像的方式 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 除了标准的使用 Dockerfile 生成镜像的方法外&#xff0c;由于各种特殊需求和历史原因&#xff0c;还提供了一些其它…

【算法】快排

快速排序 其利用的思想就是分治思想&#xff0c;最开始先从数组中随机选择一个元素p&#xff08;为什么随机下面解释&#xff09;&#xff0c;然后以这个元素对数组中的元素进行分类&#xff0c;数组左侧都是小于p的元素&#xff0c; 右侧都是大于等于p的元素。这样就让数组分成…

【C基础】堆内存创建/释放和内存清理函数/内存泄漏

本期涉及到了较多的指针&#xff0c;没有彻底领悟的同学请翻阅之前的博文~ 一闪一闪亮晶晶&#xff0c;满天都是小星星*** 什么是堆内存&#xff1a; 是进程的一个内存段(text、data、bss、heap、stack)之一&#xff0c;由程序员手动管理&#xff0c; 特点就是足够大&#x…

19_05_01校内训练[polygon]

题意 把一个边长为1的正n边形放到一个正m边形中&#xff0c;要求m边形完全覆盖n边形&#xff0c;可以有交点&#xff0c;并且中心重合。求正m边形的最小边长&#xff0c;至少精确到6位。要求logn计算。 思考 先考虑m|n的情况。 我们知道&#xff0c;正m边形的边长与可行区域&am…

六度人脉 全球最高效的人脉法则(图)

六度人脉这一概念&#xff0c;在20世纪60年代由美国心理学家Stanley Milgram提出并验证。 所谓六度人脉&#xff0c;即地球上所有的人都可以通过六层以内的熟人关系链和其他人联系起来。 通俗地说&#xff1a;“最多通过六个人你就可以认识地球上任何一个陌生人。” SNS(社会…

[转]numpy中的np.max 与 np.maximum区别

转自&#xff1a;https://blog.csdn.net/lanchunhui/article/details/52700895 转载于:https://www.cnblogs.com/xianhan/p/10609319.html

JVM 的 Finalization Delay 引起的 OOM(java.lang.OutOfMemoryError:null at sun.misc.Unsafe.allocateMemory.)

今天在压力测试环境某一个服务出现crash了&#xff0c;经过一番检查&#xff0c;终于发现是由于JVM的Finalization Delay引起的&#xff0c;这个问题比较特殊&#xff0c;这里记录一下。 这个服务是用Java写的&#xff0c;主要完成的功能是根据特定的指令文件生成mp4文件&#…

win10 php7+apache2.4的配置以及遇到的问题及解决

首先进入PHP官网下载php7的版本,我下的是PHP7.1.28,在PHP的下载页面注意划红线和绿线的地方(我画的) 1.画了红线的意思是请使用由apache lounge提供的编译文件,也就是点进蓝色Apache lounge这里下载. 2.画了绿色的线的意思是用Apache的话你必须使用Thread Safe(线程安全)的PHP…

缓存区的输入输出,字符串常用操作,实现strlen/strcpy/strcat/strcmp函数)

输出缓冲区&#xff1a; 程序输入的数据并不能立即显示在屏幕上&#xff0c;而是先存储在输出缓冲区中&#xff0c;满足一些条件后才显示出来。 1、遇到\n后 2、遇到输入语句 3、当输出缓冲区满4K 4、当程序结束 5、手动刷新 fflush(stdout) 缓冲区机制可以提高数据的读写速度…

理性分散投资 收益袋袋平安

理财锦囊 想要投资理财&#xff0c;不光可以选择股票和债券这类入门产品&#xff0c; 实际上&#xff0c;还可选择其他低风险及高回报的投资产品&#xff0c;例如外汇、期货和商品。 针对此&#xff0c;几位分析师预测了2014年各国经济走势的重点&#xff0c;协助散户们分配…

AI一周热闻:华为豪掷3.3亿剑桥买地,自建光芯片工厂;比特大陆IPO失败,组织架构调整...

导读 华为豪掷3.3亿剑桥买地&#xff0c;自建光芯片工厂苹果春季发布会无硬件发布&#xff0c;转型之心迫切比特大陆IPO失败&#xff0c;组织架构调整&#xff0c;王海超任CEO特斯拉起诉小鹏汽车员工窃取商业机密英伟达发布GauGAN&#xff0c;线条色块秒变逼真图像用机器学习防…

Docker 环境:Nexus3.x 的私有仓库

Nexus3.x 的私有仓库 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 使用 Docker 官方的 Registry 创建的仓库面临一些维护问题。比如某些镜像删除以后空间默认是不会回收的&#xff…

虚拟环境vitualenv的使用

Python3开发之虚拟环境virtualenv与virtualenvwrapper 在使用 Python 开发的过程中&#xff0c;工程一多&#xff0c;难免会碰到不同的工程依赖不同版本的库的问题&#xff1b; 亦或者是在开发过程中不想让物理环境里充斥各种各样的库&#xff0c;引发未来的依赖灾难。 此时&am…

find_first_of和find函数的区别

小记&#xff1a; find_first_of函数最容易出错的地方是和find函数搞混。它最大的区别就是如果在一个字符串str1中查找另一个字符串str2&#xff0c;如果str1中含有str2中的任何字符&#xff0c;则就会查找成功&#xff0c;而find则不同&#xff1b;

银行各类理财收益渐涨 各类宝钱景尚不明朗

这个春天&#xff0c;投资似乎进入了一个好事多磨的阶段。央行一反先前支持的态度&#xff0c;开始对互联网理财念起了“紧箍咒”。一时间&#xff0c;各种“宝”的命运变得扑朔迷离起来。尽管各种“宝”声明&#xff1a;不受央行政策影响。而投资者内心的担忧&#xff0c;恐怕…