红黑树(下)完整删除过程

简介: 红黑树一般用在较为底层的地方作为保证效率的数据结构,且红黑树的删除算法特别复杂!了解即可,手写出的难度较大。对于删除算法,很多书上没有提及,或者写的很混乱。全网亦没有一篇文章通俗易懂的讲清楚了其中过程,此文也是参考了几篇大牛的博文,部分为笔者原创,部分为引用整合。 红黑树的删除其实就是基于二叉搜索树的删除上加入一个调色过程。在弄清楚红黑树的删除操作之前,需要明白二叉搜索树的删除方法。首先要明白几个概念:

红黑树一般用在较为底层的地方作为保证效率的数据结构,

且红黑树的删除算法特别复杂!了解即可,手写出的难度较大。

对于删除算法,很多书上没有提及,或者写的很混乱。

全网亦没有一篇文章通俗易懂的讲清楚了其中过程,

此文也是参考了几篇大牛的博文,部分为笔者原创,部分为引用整合。

红黑树的删除其实就是基于二叉搜索树的删除上加入一个调色过程。


在弄清楚红黑树的删除操作之前,需要明白二叉搜索树的删除方法。


首先要明白几个概念:


直接前继:当前节点左子树的最右节点。此节点是当前节点左子树中的最大值,也就是左子树区间中值最接近当前节点的节点。


直接后继:当前节点右子树的最左节点。此节点是当前节点右子树中的最小值,也就是右子树区间中值最接近当前节点的节点。


所以,二叉搜索树的删除思路就是用所要删除的直接前继或者直接后继节点来代替该节点即可。这样整颗二叉搜索树仍然会保持有序。

20190729144927213.png

接下来以《手撕JAVA(十五)》一文中建立的较为复杂的那棵红黑树为例进行删除演示整个删除过程的算法可总结为:


1.当被删除元素为红时,对五条性质没有什么影响,直接删除。

2.当被删除元素为黑且为根节点时,直接删除。

3.当被删除元素为黑,且有一个右子节点为红时,将右子节点涂黑放到被删除元素的位置。


4.当被删除元素为黑,且兄弟节点为黑,兄弟节点两个孩子也为黑,父节点为红,此时,交换兄弟节点与父节点的颜色;NIL元素是指每个叶节点都有两个空的,颜色为黑的NIL元素,需要他的时候就可以把它看成两个黑元素,不需要的时候可以忽视他。


5.当被删除元素为黑、并且为父节点的左支,且兄弟颜色为黑,兄弟的右支为红色,这个时候需要交换兄弟与父亲的颜色,并把父亲涂黑、兄弟的右支涂黑,并以父节点为中心左转。


6.当被删除元素为黑、并且为父节点的左支,且兄弟颜色为黑,兄弟的左支为红色,这个时候需要先把兄弟与兄弟的左子节点颜色互换,进行右转,然后就变成了规则5一样了,在按照规则5进行旋转。


7.当被删除元素为黑且为父元素的右支时,跟情况5.情况6 互为镜像。

8.被删除元素为黑且兄弟节点为黑,兄弟节点的孩子为黑,父亲为黑,这个时候需要将兄弟节点变为红,再把父亲看做那个被删除的元素(只是看做,实际上不删除),看看父亲符和哪一条删除规则,

20131106205029515.jpg

目录
相关文章
|
5月前
|
存储
链表增删操作问题及解决方法
链表增删操作问题及解决方法
|
4月前
|
算法
数据结构和算法学习记录——认识二叉搜索树及二叉搜索树的查找操作(递归以及迭代实现-查找操作、查找最大和最小元素)
数据结构和算法学习记录——认识二叉搜索树及二叉搜索树的查找操作(递归以及迭代实现-查找操作、查找最大和最小元素)
41 0
|
4月前
|
算法
数据结构和算法学习记录——二叉搜索树的插入操作、删除操作
数据结构和算法学习记录——二叉搜索树的插入操作、删除操作
24 0
数据结构(7)树形结构——红黑树(概念、插入过程、删除过程)
7.1.概述 平衡二叉树是要求任意结点的左右子树高度差不超过1,因此在AVL中用旋转来保证树的绝对平衡,但是这些旋转操作步骤繁多很耗时间,所以在面对经常会有数据插入的场景时,AVL不是一个性能优秀的选择。这时候反过来思考一个问题,旋转是为了保证树的绝对平衡,但是树的绝对平衡是必须的吗?显然不是,树的高度差只要不是太高从而退化成斜二叉树其实就能接受。
87 0
剑指offer 17. 删除链表中重复的节点
剑指offer 17. 删除链表中重复的节点
54 0
【C++】红黑树的插入分析及验证
【C++】红黑树的插入分析及验证
47 0
|
算法
一天一个算法——>二叉搜索树的插入、查询、删除
一天一个算法——>二叉搜索树的插入、查询、删除
75 0
|
存储 算法
删除链表的节点(简单难度)
删除链表的节点(简单难度)
78 0
删除链表的节点(简单难度)
|
前端开发 测试技术 程序员
删除链表中的重复节点.
删除链表中的重复节点.
删除链表中的重复节点.