包含的前缀数目超过了最大值。最大值为 2_动画 | 什么是红黑树?(基于2-3树)...

news/2024/7/7 19:41:48

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

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

2.根节点是黑色的;

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

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

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

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

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

570e31777296594968fd716c1ff25c79.png

红黑是指被指向节点的链接颜色,对于一颗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-节点转成二叉只增加了左红链接,其他黑链接没有什么变化,依然是黑色平衡的。

查找元素

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

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

旋转

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

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

7820d290ac9ee0d36539a55a92ec0bc4.png

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

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

185f51a4a624150c6f55bb9d1244e14a.png

Code:左旋转和右旋转

c7c288da68164d3cc77a2be22d5b5784.png

颜色转换

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

a92cb0e3bf205886c4605a31dc238b10.png

Code:颜色转换

deba21299c818afdc2fa65ad842bd640.png

插入元素

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

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

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

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

a836ba8d4272cbf97cd2aaf6c2bd9e4d.png

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

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

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

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

127d3179a29d96e132b705468cb48ba0.png

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

动画:插入节点

6a7de0d56687eedca6b7c5be35dc4e4d.png
https://www.zhihu.com/video/1194629090362314752

Code:插入元素

b6845077c48bd7eeff195bc8a640515b.png

删除元素

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

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

55f0c1d9d40d45be892e04ae4d5e6673.png

删除元素有4个原则:

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

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

3.从树底部删除节点;

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

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

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

删除最小元素

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

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

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

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

ca9e07f5e740c2ae43da08213e15198c.png

Code:moveRedLeft

400827c0afbacd50d649effe05f0497b.png

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

动画:删除最小元素

46f0a33f573c73e5d5e2a41690622259.png
https://www.zhihu.com/video/1194629039783030784

Code:删除最小元素

b2b58c5200b7b1bf30c8db1c81252c88.png

删除任意元素

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

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

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

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

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

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

63f2817088b209965f676f1ddab86dd3.png

Code:moveRedRight

7f11fc29e71f01aac1070963290f0a12.png

Code:删除任意元素

4fef68bb8e11db8c53615489ec7fab15.png

动画:删除任意元素

4d9a9dd15f8d5f633ce67dca8b338741.png
https://www.zhihu.com/video/1194628978718310400

可查看算法4里的RedBlackTree.java源码

https://algs4.cs.princeton.edu/33balanced/RedBlackBST.java.html


http://www.niftyadmin.cn/n/4261561.html

相关文章

Spring Cloud Config 加密和解密

2019独角兽企业重金招聘Python工程师标准>>> 要使用加密和解密功能,您需要在JVM中安装全面的JCE(默认情况下不存在)。您可以从Oracle下载“Java加密扩展(JCE)无限强度管理策略文件”,并按照安装…

串口 发送 接收 高位_浅谈串口通讯的起始、数据、停止位是怎么分配的?

浅谈串口通讯的起始、数据、停止位是怎么分配的?串口是串行接口(serial port)的简称,也称为串行通信接口或COM接口。串口通信是指采用串行通信协议(serial communication)在一条信号线上将数据一个比特一个比特地逐位进行传输的通信模式。串口按电气标准及协议来划…

表单引擎 开源php,Tpfd 表单设计 1.0 正式发布

使用简要流程图DROP TABLE IF EXISTS leipi_form;CREATE TABLE leipi_form (id int(11) NOT NULL AUTO_INCREMENT,title varchar(255) DEFAULT NULL COMMENT 表单名称,name varchar(255) DEFAULT NULL COMMENT 表名,file varchar(255) DEFAULT NULL COMMENT 生成文件,menu int(…

matlab求princomp,matlabprincomp用法

利用Matlab中的princomp命令实现。具体程序如下 X [0.7883...利用Matlab中的princomp命令实现。具体程序如下 X [0.7883...Matlab 程序:[coeff,score,latent]princomp(X) 注:该函数使用协方差阵作主成分分析。 主成分分析程序 a[]; bcorrcoef(zscore(a))%计算相关系数矩阵 D...…

ros自带到期通知_韩网曝YG计划,BLACKPINK成员Rosé即将solo

熟悉BLACKPINK都知道组合已经出道四年多了,如今在临近2023年合约到期也仅剩两年多了,关于Jennie、jisoo、Lisa、Ros的未来发展问题一直备受粉丝们关注,毕竟组合都是一代一代更新的,未来个人发展也是需要考虑的,除了Jen…

我的网站和我的名字

在YAHOO中国,BAIDU上搜索“何直群”,居然可以发现我的网站:我摘([url]http://www.wozhai.com[/url])。我记得在这个网站上,我从来没有放过我的名字的。不知道这是不是现在的搜索引擎的一个新功能。转载于:https://blog.51cto.com/…

Unity LOD-Level of Detail(多层次细节)用法教程

Unity LOD 多层次细节本文提供全流程,中文翻译。 Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例) Chinar —— 心分享、心创新!助力快速理解 U…

小牛485通讯原理_485通讯原理

RS485接口组成的半双工网络,一般是两线制,多采用屏蔽双绞线传输,这种接线方式为总线式拓扑结构在同一总线上最多可以挂接32个结点。我们知道,最初数据是模拟信号输出简单过程量,后来仪表接口是RS232接口,这…