红黑树原件 及其插入、删除(附图说明)
一、概念
R-B Tree,全称是Red-Black Tree又称红黑树,它是一种特殊的二叉查找树,红黑树的每个节点上都有存储位表示节点的颜色,可以是红或黑。
二、特性
- 每个节点或者是红色,或者是黑色
- 根节点是黑色的
- 每个叶子节点(NIL)是黑色的。注意:这里的叶子节点,是指为空的叶子节点
- 如果一个节点是红色的,则它的子节点必须是黑色的
- 从任意一个节点到其叶子的所有路径中,所包含的黑节点数量是相同的
- 特性解析1:根据特性4可知,从每个叶子节点到根节点的所有路径中不能有两个连续的红节点
特性解析2:根据特性5可知,没有一条路径会比其它路径长出两倍,因而红黑树是接近平衡的二叉树
三、应用
红黑树主要用于存储有序的数据,它的时间复杂度是O(logn),非常高效
四、基本操作——插入
1、简介
红黑树的基本操作是添加和删除,在对红黑树进行添加和删除之后,都会用到旋转方法。为什么要用旋转方法呢?因为添加或删除红黑树的节点之后,红黑树就发生了变化,可能就不满足红黑树的5条性质了,也就不是一颗红黑树了。而通过旋转可以使这棵树重新成为红黑树,即旋转的目的就是为了保证红黑树的特性
- 左旋:对节点x进行左旋,意味着将“x的右孩子变成x的父亲”,而将“x原先的右孩子的左孩子变成x的右孩子”。即左旋中的“左”是指将别旋转的节点变成一个左节点
- 右旋:对节点x进行右旋,意味着将“x的左孩子变成x的父亲,而将”x原先的左孩子的右孩子变成x的右孩子“。即右旋中的”右“是指将被旋转的节点变成一个右节点
2、插入规则
新插入的节点都为红色
3、红黑树插入的4种情形
- 新节点位于根节点,其没有父节点时,处理思路:将该节点直接设为黑色即可
- 新节点的父节点已然是黑色时,处理思路:不用动,这已然是一颗红黑树
- 父节点和叔节点都是红色时,处理思路:a.将父节点和叔节点设为黑色;b.将祖父节点设为红色;c.将祖父节点设为当前节点,并继续对新当前节点进行操作
- 父节点是红色,叔节点是黑色时,又分如下四种情况:
- 当前节点是父亲的左孩子,父亲是祖父的左孩子(Left-Left),处理思路:a.将祖父节点右旋;b.交换父节点和祖父节点的颜色
- 当前节点是父亲的右孩子,父亲是祖父的左孩子(Right-Left),处理思路:a.将父节点左旋,并将父节点作为当前节点; b.然后再使用Left Left情形
- 当前节点是父亲的右孩子,父亲是祖父的右孩子(Right-Right),处理思路:a.将祖父节点左旋;b.交换父节点和祖父节点的颜色
- 当前节点是父亲的左孩子,父亲是祖父的右孩子(Left-Right),处理思路:a.将父节点右旋,并将父节点作为当前节点; b.然后再使用Right Right情形
4、插入图例
通过插入12 1 9 2 0 11 7 19 4 15 18 5 14 13 10 16 6 3 8 17完成上述所有情形的展示。
(1)插入12
说明:插入的节点若是根节点,则直接将其设置为黑色
(2)插入1
说明:插入的节点若不是根节点,则将其设置为红色
(3)插入9
(4)插入2
5)插入0
(6)插入11
(7)插入7
(8)插入19
9)插入4
(10)插入15
(11)插入18
(12)插入5
(13)插入14
(14)插入13
(15)插入10
(16)插入16
(17)插入6
(18)插入3
(19)插入8
(20)插入17
插入的过程讲解完毕。
五、基本操作——删除
1、红黑树删除的情形
一、从树中删除节点X(以寻找后继节点的方式进行删除)
情况①:如果X没有孩子,且如果X是红色,直接删除X;如果X是黑色,则以X为当前节点进行旋转调色,最后删掉X
情况②:如果X只有一个孩子C,交换X和C的数值,再对新X进行删除。根据红黑树特性,此时X不可能为红色,因为红色节点要么没有孩子,要么有两个黑孩子。此时以新X为当前节点进行情况①的判断
情况③:如果X有两个孩子,则从后继中找到最小节点D,交换X和D的数值,再对新X进行删除。此时以新X为当前节点进行情况①或②的判断。
二、旋转调色(N=旋转调色的当前节点[等于情况①中的X],P=N的父亲,W=N的兄弟,Nf=N的远侄子,Nn=N的近侄子)
A:N是根或者N是红色,则:直接将N设为黑色
B:N不是根且N是黑色,且W为红色,则:将W设为黑色,P设为红色,对P进行旋转(N为P的左子时进行左旋,N为P的右子时进行右旋),将情况转化为情况A、B、C、D、E
C:N不是根且N是黑色,且W为黑色,且W的左右子均为黑色,则:将W设为红色,将P设为当前节点进行旋转调色,将情况转化为情况A、B、C、D、E
D:N不是根且N是黑色,且W为黑色,且Nf为黑色,Nn为红色,则:交换W与Nn的颜色,并对W进行旋转(N为P的左子进行右旋,N为P的右子进行左旋),旋转后N的新兄弟W有一个红色WR,则转换为情况E
E:N不是根且N是黑色,且W为黑色,且Nf为红色,Nn为黑色,则:将W设为P的颜色,P和Nf设为黑色,并对P进行旋转(N为P的左子进行左旋,N为P的右子进行右旋),N设为根
2、插入图例
通过删除12 1 9 2 0 11 7 19 4 15 18 5 14 13 10 16 6 3 8 17完成上述所有情形的展示:
(1)删除12
(2)删除1
(3)删除9
(4)删除2
(5)删除0
(6)删除11
(7)删除7
(8)删除19
(9)删除4
(10)删除15
(11)删除18
(12)删除5
(13)删除14
(14)删除13
(15)删除10
(16)删除16
(17)删除6
(18)删除3
(19)删除8
(20)删除20
删除完毕!
红黑树原件 及其插入、删除(附图说明)相关推荐
- 详细介绍红黑树 性质 定义 插入删除操作
红黑树 定义 节点是红色或黑色 根结点一定是黑色 所有叶子节点都是黑色(指的是null) 每个红色节点的两个子节点都是黑色(从每个叶子到根的所有路径上不能有两个连续的红色节点) 从任意节点到其每个叶子 ...
- 红黑树:节点插入详解及其红黑树自我实现
红黑树:节点插入详解及其红黑树自我实现 红黑树的四个性质: 每个结点不是红色就是黑色 根节点是黑色的 如果一个节点是红色的,则它的两个孩子结点是黑色的 对于每个结点,从该结点到其所有后代叶结点的简单路 ...
- 红黑树 键值_Java集合框架:红黑树概念、插入及旋转操作详细解读就问你会不会...
初识TreeMap 之前的文章讲解了两种Map,分别是HashMap与LinkedHashMap,它们保证了以O(1)的时间复杂度进行增.删.改.查,从存储角度考虑,这两种数据结构是非常优秀的.另外, ...
- 数据结构之红黑树(三)——删除操作
删除一个节点相同有可能改变树的平衡性,并且,删除所造成的不平衡性比插入所造成的平衡性的修正更加复杂. 化繁为简是算法分析中一个经常使用的方法.以下我们将欲删除节点分为三大类:欲删除节点为叶子节点.欲删 ...
- 左倾红黑树(LLRBT)删除操作及相关性质总结答疑
Left-leaning Red Black Tree 看算法4(算法 第4版 Algorithms 4th Edition)3.4节时,后面的习题有实现左倾红黑树删除操作的代码,刚开始看得云里雾里的 ...
- 红黑树 删除某节点后 旋转3次 举例
博客转自自己的新浪博客,属于自己原创 下面对红黑树删除某节点后,旋转三次的例子做出详解: 先利用代码建立树如下: 修改颜色分布为下列树: 修改颜色分布后,利用 tree->insert(1); ...
- 面试官:了解二叉树吗,平衡二叉树,红黑树?
前言 面试过程中,多多少少会问一点数据结构(二叉树)的问题,今天我们来复习一下二叉树的相关问题,文末总结. 1. 二叉树的由来 在 jdk1.8 之前,HashMap 的数据结构由「数组+链表」组成, ...
- 彻底理解面试难点之rb-tree(红黑树)续--对红黑树的插入和删除操作的一些理解!!!
这里主要讲一下对红黑树的插入和删除操作的一些理解 对于红黑树的一些相关性质的介绍,上篇已经讲了,这里不再介绍,有需要了解的,可以翻前面的博客看看. 1.红黑树的插入操作 对于红黑树的元素插入,我们首先 ...
- 红黑树从头至尾插入和删除结点的全程演示图
红黑树插入和删除结点的全程演示 作者:July.saturnman. 时间:二零一一年三月二十八日. 出处:http://blog.csdn.net/v_JULY_v. 声明:版权所有,侵权必究. - ...
最新文章
- 使用Jenkins持续集成Vue项目配置Sonar任务
- before与after的一些应用总结
- python 温度 符号_【火马】Python学习小记01
- 多线程与高并发(三):JUC包下新的同步机制:CAS,AtomicInteger,AtomicLong,ReentrantLock,CountDownLatch,ReadWriteLock等
- c#中引用类型作为值参数和引用参数问题
- mysql中函数大全_MySql 函数大全(一)
- axios下载图片 node_vue+node.js手把手教你搭建一个直播平台(二)
- VS2013+OSG3.4.0+Qt5.5.1编译(超详)
- 大一计算机基础考试知识点,大学计算机基础考试知识点(完整版)
- oracle插入新字段脚本
- springboot发送邮件(QQ邮箱)
- r语言 新增一列数字类型_R语言实战(2)——创建数据集【学习分享】
- 蓄水池抽样算法(reservoir sampling)
- VB实现移动鼠标产生粒子效果
- 打开小地图并标记目标地点
- TVS(瞬态抑制二极管)、Schottky(肖特基二极管)、Zener (齐纳二极管,也称稳压二极管)主要特点及区别和使用
- 笔记:在CentOS上开始你的工作
- DevOps到底是什么意思?-小白收藏
- 基于JavaWEB+MySQL的二手闲置物品交易网站系统
- VBS msgbox
热门文章
- 文件系统(01):基于SpringBoot框架,管理Excel和PDF文件类型
- Document API
- 利用 Win32 启动和检测 UWP App 的方法
- 表likp新增第一次过账输入日期字段,vl02n/vl01n/vl03n/vl06o的增强
- 什么叫事务?Java如何处理事务呢?
- ASP.NET操作简单的xml,增删改查
- 最大堆java构建,jvm - 无效的最大堆大小 - 堆栈内存溢出
- MySQL数据库搜题_智慧树_MySQL数据库设计与应用_搜题公众号
- oracle 区管理系统,oracle区管理和段空间管理详细介绍
- 信息学奥赛一本通(1034:计算三角形面积)