浅谈红黑树

这篇文章的删除操作参考这篇博客博客地址

聊红黑树之前我想先来谈谈B树(多路平衡查找树),为什么来聊这个东西呢,其实红黑树就是一个B树。了解B树后对红黑树的理解会比较有帮助。
首先是2、3、4节点。
在这里插入图片描述
红黑树中单个黑节点对应B树中一个2节点,黑节点加上一个红节点对应一个3节点,黑节点加上两个红节点对应4节点。这边看一个示例:
在这里插入图片描述
介绍完插入后正式开始聊聊红黑树。
一、红黑树的红黑规则
1.根节点是黑色的。
2.插入节点是红色的。e.g.不是说一直是红色,插入的节点可以进行变色
3.每个叶节点(NIL)都是黑色节点。
4.不能存在两个连续的红色节点
5.从任一节点出发到叶节点(NIL)的路径上存在相等数量的黑色节点。

ps:红黑树的黑色节点越多红黑树就平衡,如果一颗红黑树全是黑色节点,那么这一定是一颗满二叉树。
下面是一颗不符合红黑树规则5的树。
在这里插入图片描述

下面先明确两个概念左旋与右旋:
右旋
在这里插入图片描述

左旋
在这里插入图片描述

二、插入
根据红黑树规则的第5条很容易想到插入的节点的颜色一定是红色的。

插入大概分成以下几种情况:
1.根节点,直接变色
在这里插入图片描述

2.插入的位置的父节点是黑色,直接插入。
在这里插入图片描述

3.插入的位置的父节点是红色(处理这些情况主要注意两个红色节点出现的位置和插入节点的叔叔节点的颜色,根据实际情况进行调整)
又可以分为以下两种情况
3-1: 叔叔节点是红色
这种情况可以让父亲节点和叔叔节点还有祖父节点直接变色就能解决。
在这里插入图片描述
注意如果这里变色之后出现两个连续的红色节点那么递归向上进行调整,直到根节点,最后根据红黑树第1条规则将根节点染黑

3-2: 叔叔节点是黑色(这里的情况有点和AVL类似可以先去看一下AVL再来看插入操作应该有简单很多)
这种情况又要分为两种情况
3-2-1: 插入节点插入的位置与父节点相对于祖父节点位置相同时,也就是出现黑红红节点时的位置为左左左/右右右时,直接右旋/左旋处理。
下面给出左左左的例子:
在这里插入图片描述
插入完成后可以看到在出现了两个连续的红色节点这边违反了红黑树的规则4所以这边要进行右旋调整。右旋后要对节点进行变色处理使其重新符合红黑树的规则。
在这里插入图片描述
可能这里会有疑问了为什么不是下面这个变色呢?
在这里插入图片描述

我的理解是如果是这样变色的话变完之后可能会存在两个连续的红色节点,可能还要再变一次所以没必要。

3-2-2插入节点插入的位置与父节点相对于祖父节点位置不相同时,也就是出现黑红红节点时的位置为左左右/右右左时,这个时候要先进行一次左旋再进行右旋/先进行一次右旋再进行左旋。
在这里插入图片描述
进行一次左旋或者右旋之后就可以跳转到3-2-1的情况进行同样处理了。
红黑树插入操作总结:
父黑直接插,叔黑看双红。左左右右单次转,左右右左两次转。

在聊红黑树删除之前,我想先聊聊B树的删除操作。
B树的删除分为下面三种情况:
1.可以直接删除的,就直接删除。
在这里插入图片描述
2.“兄弟够借”的情况
图中要删除一个二节点65,那肯定不行啊删了就没了,那怎么办呢,往他的右边兄弟去借,借了之后就能删了。

3.“兄弟不够借“的情况
”兄弟不够借“这种情况就麻烦一点,图中要删除5这个结点,5也是一个二节点,他的左右兄弟都没有能借的了,那怎么办呢,只能找他的父节点去借一个数了和他的兄弟结点一起组成一个结点,

三、 删除
这边删除的主要思想是:找到被删除节点的直接后继然后用直接后继的值替换掉被删除节点的值然后删除直接后继。所以不论如何被删除节点都有一个“右子树”,但右子树可能为空树。且右子节点为NIL节点。
删除可以分为三种情况:
1.被删除节点没有子节点(均为NIL)
删红色节点直接删就可以,但是如果要删除的是黑色节点那么删除之后黑色节点的个数会减少一,违反了红黑树的第4条规则,这个时候就需要进行调整了。
在这里插入图片描述

2.被删除节点有一个子节点
在这里插入图片描述

这个时候子节点一定为红色,因为如果子节点为黑色就会违反红黑树第4条规则导致有子节点的那一边多出一个黑色节点。同时待删除节点一定会为黑色如果待删除节点为红色就会违反红黑树第5条规则,将待删除节点删除之后只需要将待删除节点的子节点放到待删除节点的位置然后将子节点颜色涂黑即可。

3.被删除节点有两个子节点
这种情况是最复杂最烦人的,一般采用将待删除节点的直接后继的值放到要删除的位置然后将直接后继删除。下面讲讲为什么可以转化为第一种和第二种情况:这边遍历顺序是中序遍历,也就是说待删除节点的直接后继的左子树一定为NIL而右子树可能是NIL也可能不是。
这个情况的方法分为两种因为过自己这条路径的黑色节点因为删除了一个所以比过兄弟节点那条路径少一。
1.让兄弟节点那条路少过一个黑色节点自己这边路径不变
2.自己这边多过一个黑色节点,兄弟节点那条路径不变。
兄弟结点为黑
白色节点表示不关心节点颜色
下面分3种情况讨论:被删除节点的兄弟子左右子节点分别为黑黑,(红黑,黑红),红红讨论。
下面的情况根据兄弟节点子节点出现红色节点的位置和兄弟节点相对于父节点的位置进行调整。
1.黑黑
在这里插入图片描述
直接让兄弟路径少一就行了,直接把兄弟节点给染红。
2.红黑/黑红/红红的情况,这种情况要结合上面的左旋/右旋的情况来理解会比较好。
这边可以分为右右右型,右右左型,左左左型,左左右型。其中右右右和左左左型分别变色+一次旋转即可。右右左和左左右型则要旋转+变色+旋转+变色。
在这里插入图片描述
在这里插入图片描述
注意右边图片是红黑平衡的这边给出一个具体的例子来帮助理解,当初我一直以为这里违反了红黑树第5条规则纠结了好久。在这里插入图片描述
兄弟节点为红
在这里插入图片描述

注意!经过上述调整之后,进行“子”节点的黑色节点仍然少1。

在这里插入图片描述
这个时候只要再次左旋或者再次右旋即可平衡。这边只给出一种情况的图另外一种情况类似。e.g.这边解释一下上面的子节点一定为NIL节点,至于为什么可以自己思考一下。所以上面的图仍然遵守红黑树第5条规则

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值