数据结构---红黑树

红黑树本质是二叉搜索树的一个变种,它在每个节点上增加了一个存储位来表示节点的颜色,可以是红或者黑。通过对任何一条根节点到叶子结点的路径上各个节点的颜色进行约束,确保没有任何一条路径会比其它路径长出2倍,从而达到近似于平衡。

红黑树包含五大特性:

  • 每个节点要么是黑色,要么是红色
  • 根节点一定是黑色
  • 每个叶子结点(NIL)一定是黑色
  • 每个红色节点的两个子节点一定是黑色,即不能有两个红色节点相连
  • 任意一节点到每个叶子节点的路径都包含数量相同的黑色节点,俗称:黑高

黑高: 下面给我详细概念便于理解,从某个节点n出发(不含该节点)到达一个叶子结点的任意一条简单路径上的黑色节点个数称为该节点的黑高,记为bh(n)。

插入

操作: 插入3
分析: 此时3一定会插入到5的左面,同时两个红色不能相邻所以010一定要变为红色,005变为黑色后又不符合黑高特性10到3经过一个黑色节点005,所以0015也需要变为黑色
情形: 叔叔结点存在并且为红结点
在这里插入图片描述在这里插入图片描述

操作: 插入22
分析: 此时22小玉25且大于20一定会插入25左边,同时两个红色节点不能相连25需要变为黑色。变化之后黑色30到两边叶子结点的黑高不相等左面多右面少。此时需要右旋进行平衡可以想象把25拎起来22与30节点顺势成为左右子节点。此时25到叶子结点的黑高依然不相等因为30为黑色多了一个,这样就需要将30变色为红色完成最后的平衡。
情形: :叔叔结点不存在或为黑结点,并且插入结点的父亲结点是祖父结点的左子结点
在这里插入图片描述在这里插入图片描述

操作: 插入21
分析: 21插入到22左边后,两个红色不能相邻22需要改色为黑色。直接导致25又侧黑高小于左侧,30需要变为黑色进行平衡。但是此时25为黑色节点不符合两个红色节点的子节点为黑色的特性,所以25需要变为红色至此完全符合要求。
情形: :插入结点是其父结点的左子结点,存在叔叔节点
在这里插入图片描述在这里插入图片描述
操作: 插入18
分析: 在将18插入到15的右侧后因为18为红色不需要变色且左右黑高一致不需要旋转,所以直接插入即可
情形: 插入结点是其父结点的右子结点
在这里插入图片描述在这里插入图片描述
同上情节一样插入24父节点右子节点时不需要变动
在这里插入图片描述
操作: 插入27
分析: 27会插入30左边颜色与个数都符合要求不需要变动
情形: 叔叔结点不存在或者为黑节点
在这里插入图片描述
操作: 插入4
分析: 4会插入到5左子节点除3插入到4左子节点处,3与4两个红色节点不能相连此时需要进行右旋将4拎起来放到10的左子节点此时5就成为了4的右子节点。4是红的不能与10相邻需要变为黑色,而黑色两边子节点必须是红色所以5变为红色。到此都符合要求
情形: 叔叔结点不存在或者为黑节点
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
操作: 插入4
分析: 4会插入到5左子节点除3插入到4左子节点处,3与4两个红色节点不能相连此时需要进行右旋将4拎起来放到10的左子节点此时5就成为了4的右子节点。4是红的不能与10相邻需要变为黑色,而黑色两边子节点必须是红色所以5变为红色。到此都符合要求
情形: 叔叔结点不存在或者为黑节点

删除:

红黑树的删除操作也包括两部分工作:一查找目标结点;而删除后自平衡。查找目标结点显然可以复用查找操作,当不存在目标结点时,忽略本次操作;当存在目标结点时,删除后就得做自平衡处理了。删除了结点后我们还需要找结点来替代删除结点的位置,不然子树跟父辈结点断开了,除非删除结点刚好没子结点,那么就不需要替代。

操作: 删除3
分析: 3的删除并不会影响其它节点与总体平衡无需变化
情形: 删除节点无子节点
在这里插入图片描述
操作: 删除4
分析: 4删除后必须要用子节点代替,且颜色进行转换子节点与删除节点 颜色一定是相反的所以代替之后一定需要变色
情形: 删除结点只有一个子结点
在这里插入图片描述
操作: 删除22
分析: 节点删除之后首先会用左子节点代替并变色所以21移动到22之前位置并变为黑色。此操作过后24成为21右子节点各项指标符合约束不需要继续变换
情形: 删除结点有两个子结点
在这里插入图片描述
操作: 删除25
分析: 25删除后如果左子节点存在则左子节点进行替换,同时继续往下如果左子节点存在右子节点则优先右孙子节点替换。简单一句话概括就是当前删除节点往下最后一个右子节点替换。替换之后一切符合要求不需要进行多余的旋转变色
情形: 替换节点是黑色节点
在这里插入图片描述
操作: 删除20
分析: 首先去左子节点一直往右子节点找知道最后一位,白话说就是找到左边的最大值18替换。
情形: 替换节点是红色节点
在这里插入图片描述
在这里插入图片描述
为了模拟更多没考虑到的情况下面将从下图清开始删除在这里插入图片描述

操作: 删除13
分析: 删除13后13的左子节点往下找找到最小的替换,此时12最小12置换到13位置。12左侧此时则为叶子结点(NIL)开头说过,叶子结点一定为黑色。此时黑高不等左小右大右面多一个15黑节点需要左旋进行平衡,拎起15替换到12位置。
情形: 替换结点的兄弟结点是黑结点
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

操作: 删除22
分析: 删除22后,先从左子树找左子树20存在,然后会继续顺着20右子树找出右边的最大值来替换22。变换过后21到各个叶子结点的黑高不相等需要进行旋转。20右子节点即叶子结点与21之间只有一个黑色节点,其余黑高都为2。19需要变换为红色来平衡黑高。19变为红色后21左子树平衡了黑高变为了1,但是右子树都黑高都为2比左子树高,所以依然需要左旋达到最终平衡。需要将21右子节点的第一个黑色25拎起到21位置。旋转之后25到左右子树黑高相同了,但是又导致比根节点到叶子结点的黑高多了一个黑色节点,所以25依然需要变为红色完成最后的平衡。
情形: 替换结点的兄弟结点的子结点都为黑结点
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值