RB-Tree 构建、插入与删除

本文深入探讨了红黑树的构建、插入和删除操作,从二叉查找树的基础开始,讲解了左旋、右旋、插入与删除的不同情况。通过示例展示了如何处理插入和删除过程中可能出现的问题,确保红黑树始终保持其五个性质。通过对红黑树的理解和操作,有助于提升数据结构和算法的知识水平。
摘要由CSDN通过智能技术生成


红黑树只有以下 5 条性质(很简单,很好记,最好按顺序记忆)

  1. 树中结点只有两种颜色,红色和黑色
  2. 树的根是黑色结点
  3. 每个叶结点(nil[T] 也叫哨兵结点)都是黑色结点
  4. 红色结点的子红点必须为黑色结点
  5. 对任意结点,从它到它子孙叶结点的所有路径上包含相同数目的黑色结点

红黑树特点:查找效率高,即使在最坏情况下也有很好的性能,因为红黑树最长路径(红黑相间)高度不会比最短路径(全是黑结点)多出一倍。红黑树是一种特殊的二叉查找树,理解红黑树的构建、插入、删除操作,需要先明白以下概念

  1. 二叉查找树
  2. 中序遍历(LDR 遍历)
  3. 前趋、后继
  4. 左旋、右旋

本文从二叉查找树说起,涉及上面说的 4 点,最终会构建红黑树,并完成对红黑树的插入与删除操作。

二叉查找树

为了方面叙说,作以下说明:
如果 k 为一个结点,那么 key[k] 为结点 k 的值,left[k] 为结点 k 的左孩子结点,right[k] 为结点 k 的右孩子结点,p[k] 为结点 k 的父结点。
root(T) 为二叉树的根结点

二叉查找树是一棵有序的树,对于树中的结点 k 来说,它的任意左子孙结点 l 都有如下规则: key[l] <= key[k];它的任意右子孙结点 r 都服从 key[k] <= key[r] 规则。比如下面两个都是二叉查找树

在这里插入图片描述

插入

现在使用这两个树展示插入操作,插入值为 6:

在这里插入图片描述

图中每条蓝色的线代表一次比较操作,很明显向 B 中插入一个数所需的步骤比较多,这种情况是由于树太‘偏’造成的,如果所有的树都像 A 这样‘正’就完美了。

删除

删除结点有三种情况
情况一:待删除结点 k 是叶子结点,比如 A 中的 2 5 6 8 结点,B 中的 5 6 8 结点,对于这些结点直接删除就可以了,删除后不会破坏二叉查找树特性,因为除了被删除的结点,其它结点没有任何变化
情况二:待删除结点 k 有一个孩子,如 B 中的 2 3,对于这些结点删除后用它的子结点直接放到删除结点的位置
情况三:待删除结点 k 有两个孩子,如 A 中的 5 3 7 结点,B 中的 7 5 结点,此时将 k 删除,取出 k 中序遍历的后继放到 k 的位置,就完成了删除处理

下图解释了什么是中序遍历,什么是前趋和后继
在这里插入图片描述
不知道是谁把 LDR 遍历翻译成了中序遍历,反正我总是把它与前序遍历后序遍历搞混。感觉直接记 LDR、LRD、DLR 会比较知道是什么顺序。

OK,知道如何找 LDR 顺序的后继了,下面用图表示,如果删除有两个孩子的结点。最简单的一种情况如下(红色代表待删除结点,绿色代表后继,有红绿色盲的姥爷们对不住了。。。)
在这里插入图片描述
在这里插入图片描述
上面两种操作本质是一样的,待删除结点的后继都没有孩子结点,这种情况,直接将后继替换掉红色结点就完成删除操作了。但是另外一种情况需要多处理一步,比如下图:
在这里插入图片描述
此时绿色节点有个右孩子(绿色结点为红色结点 LDR 序的后继,所以它不可能有左孩子),需要先对灰色部分处理,处理方式如 情况二 先对绿色结点进行删除,然

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值