红黑树学习

概述

红黑树是一种特化的AVL树(平衡二叉树),都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。

分析:为什么会有更好的性能?

首先,红黑树也是二叉排序树。所以对于红黑树的查询来说,与其树高相关。引用大佬博客,
证明结果:一棵含有n个节点的红黑树的高度至多为2log(n+1)
由此我们可以得出其查找性能和AVL树(二叉平衡树)相差不多。
但是对于添加和删除操作来说,AVL树在性能上就不及红黑树,具体分析可参考
关于AVL树和红黑树的一点看法

在这里插入图片描述

红黑树特性

红黑树的特性:
(1)每个节点或者是黑色,或者是红色。
(2)根节点是黑色。
(3)每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!]
(4)如果一个节点是红色的,则它的子节点必须是黑色的。
(5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。

红黑树插入

首先,插入操作首先像排序二叉树一样,找到插入节点,将插入节点定义为红色插入树中。插入红色节点对于红黑树特性来说,只可能改变性质四——即红色节点的子节点必须为黑色

分类

一、如果父节点为黑色,没有任何冲突,不做任何操作。
二、如果父节点为红色,此时发生冲突,但是此时作为冲突情况的红黑树,只可能存在三种情况

1、插入节点的叔叔节点为红色,

爷爷节点到叶子节点(NIL节点)的路径上的黑色节点个数为2.此时调整完的结果必须保持路径上的黑色节点个数保持不变。有之前的定理知道,树高最高为3,由完全二叉树可知,树高最低也为3,所以树高只能为3。所以我们应该想方法让每个分支节点上只有两个黑色节点(包括NIL)。同时也需要实现红色节点不相邻。
穷举所有可能的红黑树图形,
只有将爷爷节点染为红色,再将爷爷节点的两个儿子节点染为黑色
将爷爷节点所在的子树直接当成一个整体,当成一个红色节点,而这个整体可能还是会与上部的父亲节点冲突(性质4:相邻节点不同为红)。所以将爷爷节点当成当前节点进行循环处理

2、当叔叔节点为黑时且插入节点是父节点的左孩子节点。

如果此时情况为插入在叶子节点的情况,可知叔叔节点为NIL。但是如果现在为情况一转化为来的话,我们可以将其作为一个整体分析。
我们就前一种情况分析,此时爷孙三辈中只有3个节点。计算可得,红黑树树高最高为2,且对于完全二叉树来说,树高也为2.所以要将树调整为一个树高为2的满二叉树,且保证调整后每个路径上的黑色节点(包括NIL)为2,即路径上有一个黑色节点。
穷举:可行的两种情况,
1:满二叉树的根结点为黑,叶子节点为红
2:满二叉树的根节点为红,叶子节点为黑。
完备性分析:如果根节点为红,可能会造成与上部节点冲突。但是根节点为黑一定不会冲突,且满足红黑树条件。

所以,下面我们直接将现有情况转化为情况1即可。
操作如下:
将父亲节点染为黑色,爷爷节点染为红色,在爷爷节点处进行左旋。处理结束。

就情况一调整过来的情况,作为整体经分析同样处理同样成立。

3、当叔叔节点为黑色,且当前插入节点为右孩子节点

情况类似为情况二,分析也类似。所以如果我们直接将当前请况转化为情况二,再有情况二处理。
处理:
绕父节点进行左旋,进行下一步处理。

红黑树删除

删除操作的话,首先,我们需要查找删除节点的位置。根据删除节点的位置我们可以做出以下分类。
1、无孩子节点
2、有一个孩子节点
3、有两个孩子节点。
首先对于第三种情况我们需要将其像排序二叉树删除节点操作一样,找到其后继节点,然后进行数据交换,将情况三转化为情况二和一。
首先,我们分析知道,删除操作可能会引发性质5不成立(至于性质4,可认为单单删除操作不会引发,但是将孩子节点补上时会导致,我们直接将删除节点)。

当删除节点为红色

这种情况只能为一,所以直接删除即可,不会导致红黑树不成立。

当删除节点为黑色,且兄弟节点为红色。

分析知道兄弟节点肯定有两个黑色的孩子节点。
左边删除一个黑色节点,可知道左边路迳上黑色节点个数减一。我们需要想办法将左边这个删除的黑色节点补偿回来,保证删除前后黑色节点个数没有发生变化。

调整:
将兄弟节点染为黑色,父亲节点左旋(右旋)

当删除节点为黑色,且兄弟节点为黑色,兄弟节点的有孩子为红色

同样的我们,左边减一,需要补偿,所以可以将兄弟节点与父亲节点交换颜色,再将兄弟的右孩子节点染为黑色,对父亲节点进行进行左旋

当删除节点为黑色,且兄弟节点为黑色,兄弟节点的左孩子为红色,右孩子为黑色

将其转化为上一个情况处理。
调整,将兄弟节点颜色与其左孩子节点颜色交换,进行右旋。继续循环。

当删除节点为黑色,且兄弟节点为黑色,兄弟节点的孩子节点都为黑色。

左边1减一,但是右边也只有一个黑色节点路径上只有3个节点,删除一个,无论如何都不能保证路径上的黑色节点个数和删除之前相同。所以,将其父亲节点所在子树当成整体,相当于父亲节点所在的树减一。
将兄弟节点与父亲节点颜色交换,将父亲节点当成当前节点,进行下一步处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值