红黑树

一 定义
1 每个结点是红色或是黑色
2 根结点是黑色
3 每个叶结点是黑色(这里所说的叶结点是空结点,不带任何数据。这样定义之后每个结点都有两个子节点,只是可能两个都是空的)
4 如果一个结点是红的,则它的两个子节点是黑的,即在树上不可能有两个连续的红色结点
5 每个结点到其叶子结点的所有路径上包含相同数量的黑色结点

二 红黑树因为插入或删除等操作造成上述五个定义不满足时可以通过左旋或右旋或变色来重新达到要求

三 插入(插入结点一定是红色)
若插入结点的夫结点是黑色,则五个定义都满足,故只考虑插入结点的父节点是红色的情况(所以插入结点一定有祖父结点和叔叔结点)。这种情况分为以下三类

  1. 插入结点Z的父节点为红色,叔叔结点为红色:
    将父节点和叔叔节点变成黑色,把祖父节点变为红色
    在这里插入图片描述
  2. 插入结点Z的父节点为红色,叔叔结点为黑色,z是右孩子
    以z的父节点设为当前节点,并左旋,转为情况3
    在这里插入图片描述
  3. 插入结点Z的父节点为红色,叔叔结点为黑色,z是左孩子
    以z的父节点修改为黑色,祖父节点修改为红色,以父节点为支点右旋,转为情况
    在这里插入图片描述

四 删除(如果删除的是红色结点,则五个定义仍然满足,照样是红黑树,不做修复)
删除分为三类
1 删除结点没有子节点,直接删除
2 删除结点只有一个子节点,将子节点的key-value与被删结点的key-value互换,然后删除改子节点
3 删除结点有左右子树,找到左子树的最右结点或右子树的最左结点作为替换结点,替换结点的key-value与被删结点的key-value互换,然后删除替换结点
即上述三种情况都可以视为最终转换成第一张情况

在对红黑树进行删除修复操作时,循环进入条件是当前结点x为非根结点并且是双重黑结点(引入双重黑是为了删除黑色结点是此路径上的黑色结点总数不变,双重黑变一次红色称为黑+红)。在修复函数中主要考虑以下四种情况:
情况1:x的兄弟结点w是红色的
此时需把父结点修改成红色,把兄弟结点w修改成黑色。然后,针对父结点进行左旋操作,将情况1转化为其他情况。
在这里插入图片描述

情况2:x的兄弟w是黑色的,而且w的两个孩子都是黑色的
此时需从当前结点x和兄弟节点w去掉一重黑色,从而x只有一重黑色而w是红色。同时为了补偿去掉的一重黑色,需在x的父结点上增加一重黑色,并把x的父结点作为新的当前节点,重新进入循环。
在这里插入图片描述

情况3:x的兄弟w是黑色的,w的左孩子是红色的,右孩子是黑色的
此时需把兄弟结点w修改成红色,兄弟w的左孩子修改成黑色,然后以兄弟结点w作为支点进行右旋操作,之后重新进入算法。转换成其他情况。
在这里插入图片描述
情况4:x的兄弟w是黑色的,而且w的右孩子是红色的
此时需将兄弟结点w修改成x的父结点的颜色,然后将x的父结点修改成黑色,兄弟结点w的右孩子修改成黑色,然后以x的父结点为支点进行左旋操作。此时算法结束,红黑树所有性质调整完成。
在这里插入图片描述
转自:https://www.cnblogs.com/xlzhh/p/4222957.html

https://blog.csdn.net/mmshixing/article/details/51692892
https://blog.csdn.net/daaikuaichuan/article/details/80778923

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值