红黑树添加删除

上一篇写了234树对比红黑树,和红黑树某些情况需要调整的原因,这篇就只写红黑树的添加和删除

红黑树

JAVA技术交流群:737698533

性质

  1. 每个节点要么红色要么黑色
  2. 根节点是黑色
  3. 每个叶节点是黑色的,这里叶子节点指空的节点,和二叉树的叶子节点不同
  4. 每个红色节点的两个子节点都是黑色
  5. 每个节点到它的每个叶子节点的所有路径都包含相同数目的黑色节点

添加

所有添加的节点默认都是红色

  1. 空节点
  2. 父节点为黑色
  3. 父节点为红色

1 空节点

红黑树添加删除

所有节点默认为红色,添加后5为根节点,违反了性质2″根节点是黑色” ,只需要将红变黑即可

2 父节点为黑色

2.1 父节点为黑色,直接添加,小于父添加左边,大于等于添加右边

红黑树添加删除

3 父节点为红色

情况1 祖孙三代在一条线

直接进行旋转变色即可

红黑树添加删除

红黑树添加删除

而这里面还有一种情况

我们需要先将5和6进行旋转,让它变成上面的情况,然后按照上面的操作进行添加

红黑树添加删除

红黑树添加删除

情况2有叔叔节点

情况2.1叔叔节点为红色

首先将父节点和叔叔节点变黑,爷爷节点变红, 如果10节点为根节点,那么再变黑,如果10节点变红与上面发生冲突,那么把10节点作为新添加的节点,再继续执行调整

红黑树添加删除

红黑树添加删除

删除

情况

  1. 没有子节点
  2. 有一个子节点
  3. 有两个子节点

先说有两个子节点的情况,需要寻找到它的前驱或后继节点来替代,然后删除前驱或后继节点,也就是将情况转换为1或2

关于前驱或后继节点看上篇文章

没有子节点

1.1 节点为红色

没有子节点且当前节点为红色直接删除

红黑树添加删除

1.2 节点为黑色

1.2.1兄弟节点为红色

1.2.2兄弟节点为黑色且有一个子节点

1.2.3兄弟节点为黑色且有两个子节点

1.2.4兄弟节点为黑色,没有子节点

1.2.1兄弟节点为红色

需要将兄弟节点进行旋转变色,为什么兄弟节点为红色需要旋转变色原因可以看上一篇博客,将情况变为234

红黑树添加删除

红黑树添加删除

1.2.2兄弟节点为黑色且有一个子节点

红黑树添加删除

在这里面还有一种 小情况,兄弟节点的子节点如果离自己近需要先进行旋转变色,将情况变成上面的再进行操作

红黑树添加删除

1.2.3兄弟节点为黑色且有两个子节点

有两种解决方法

1 先删除5同时将15和20进行右旋变色,然后10和15进行左旋变色,而20和15就是上面的情况, 旋转完后15两个子节点必须是黑色,如果15节点于红黑树性质冲突,那么在根据情况调整

红黑树添加删除

2 直接删除5,然后10和20进行左旋,一般都用这个方法,减少一次旋转

红黑树添加删除

1.2.4兄弟节点为黑色,没有子节点

父节点为红色

删除5,然后兄弟节点变为红色来维持父节点的左右黑色平衡,如果父节点为红色,直接变黑即可,父节点变黑是维护爷爷节点的左右黑色平衡

红黑树添加删除

如果父节点为黑色

同样也是将兄弟节点变红,然后把父节点向上递归处理

删除一个黑色节点,然后改一个红色节点,这个父节点的黑色是平衡了,如果上面还有节点呢,那么黑色节点还是不平衡,

这时就需要递归进行操作,直到出现红色父节点将其变为黑色或到达根节点为止

有子节点

  1. 删除节点为红色
  2. 删除节点为黑色

1 删除节点为红色

直接删除

红黑树添加删除

2 删除节点为黑色

只会有一种情况,有一个红色的左孩子或右孩子,如果有两个孩子那么就会去删除前驱或后置而不是当前节点,

也不可能出现一个孩子为黑色一个孩子为红色,更不可能出现只有一个黑色孩子,根据红黑树性质5就明白了

那么来看只有一个红色子节点情况

先将10和它的红色子节点20进行旋转变色,然后直接删除,5节点可以是红也可以是黑

红黑树添加删除

红黑树添加删除

练习

添加

红黑树添加删除

属于有父节点和叔叔节点,且都为红色,根据添加的3.2.1父节点和叔叔节点都为红色进行变色处理

红黑树添加删除

完成后发现因为变色6节点和4节点出现了连续两个红色,需要继续调整,把6当做新添加的节点,发现属于情况3.1祖孙三代在一条线,将2和4节点进行旋转变色

红黑树添加删除

删除

我们删除4节点,这里4就是根节点

红黑树添加删除

首先判断是那种情况,有两个子节点那就是寻找前驱或后继进行替换,我们这里使用前驱节点,也就是3

红黑树添加删除

首先判断3节点的情况,没有子节点,兄弟节点也没有节点,那就是删除情况的1.2.4兄弟节点为黑色,没有子节点

首先将值覆盖掉,然后删除3节点,将3节点的兄弟节点变色为红色

红黑树添加删除

然后发现父节点为黑色,不能进行变色来平衡,那么把2节点当做需要删除的节点(并不真正删除)继续调整

发现兄弟节点为黑色且有两个子节点,属于删除情况的1.2.3,只需要进行旋转即可

红黑树添加删除

本文仅个人理解,如果有不对的地方欢迎评论指出或私信,谢谢٩(๑>◡

Original: https://www.cnblogs.com/sunankang/p/14315211.html
Author: Jame!
Title: 红黑树添加删除

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/622116/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Null和空值对于avg计算时产生的影响以及处理

    为什么要关注这一块呢:1.面试中可能会有涉及 2.工作中真的也可能会用,既然有可能我也用过,就拿出来跟大家分享一下,上一篇的博文,数据已准备好就不做数据准备的介绍了。 step1:…

    数据库 2023年6月6日
    0127
  • Linux Shell 自动交互功能

    需求背景: 近日,在安装某软件过程,发现在安装过程需要输入一些信息才能继续下一步操作,在机器数量较少情况下,我们可以单台登录上去完成安装操作,但当机器数量超过一定时,如果再手动登录…

    数据库 2023年6月14日
    0115
  • Java8 Stream

    什么是Stream Java8 API添加了一个新的抽象称为流Stream,可以以一种声明的方式处理数据,给我们操作集合(Collection)提供了极大的便利。Stream将要处…

    数据库 2023年6月6日
    0111
  • Python 字符串的常用方法

    Python 包含6种数据类型,其中Number(数字)、String(字符串)、Tuple(元组)、 List(列表)、Dictionary(字典)、Set(集合); 这节主要讲…

    数据库 2023年6月16日
    0116
  • 即时通讯课设Android端问题记录

    转眼间,就已经是大四学生,目前正在写毕设。Android 端没有系统的学习过,都是哪里不会查哪里,基本靠度娘。所以,在此记录下课设开发过程中,Android 端遇到的问题。 在主线…

    数据库 2023年6月9日
    084
  • js中创建正则对象时,变量中存在转义字符(’/’,’.’等)时,是否需要转义?

    使用直接量创建正则时,很方便,但是如果存在变量时,不适用。 使用正则对象(RegExp)创建时,对于变量中的转义字符不需要处理。 另外测试正则地址: https://develop…

    数据库 2023年6月11日
    0144
  • Redis缓存穿透 缓存击穿 解析

    先解析一下Redis中什么叫做 缓存穿透 和 缓存击穿: 缓存穿透:首先我们要明确概念,缓存穿透是 在查询数据时 查询的数据在 redis 和 DB中都没有的 叫做缓穿透,解决方案…

    数据库 2023年6月9日
    0116
  • Yapi安装配置(CentOs)

    环境要求 nodejs(7.6+)mongodb(2.6+)git 准备工作 清除yum命令缓存 sudo yum clean all 卸载低版本nodejs yum remove…

    数据库 2023年6月11日
    0112
  • 分布式任务调度平台XXL-JOB安装

    安装xxl-job-admin 1.拉取镜像 #拉取镜像 docker pull xuxueli/xxl-job-admin:2.3.0 #新建挂载目录 mkdir /usr/lo…

    数据库 2023年6月11日
    092
  • JUC学习笔记(九)

    JUC学习笔记(一)https://www.cnblogs.com/lm66/p/15118407.htmlJUC学习笔记(二)https://www.cnblogs.com/lm…

    数据库 2023年6月6日
    096
  • QQ登录简介

    QQ登录简介 (1) QQ登录 QQ登录,亦即我们所说的第三方登录,是指用户可以不在本项目中输入密码,而直接通过第三方的验证,成功登录本项目。 若想实现QQ登录,需要成为QQ互联的…

    数据库 2023年6月14日
    0107
  • 如何使用原生的Feign

    什么是Feign Feign 是由 Netflix 团队开发的一款基于 Java 实现的 HTTP client,借鉴了 Retrofit、 JAXRS-2.0、WebSocket…

    数据库 2023年6月6日
    0156
  • MySQL特性:BKA,Batched Key Access,批量索引访问

    Nested Loop Join → Block Nested-Loop Join → Batched Key Access表Join时使用BNL/BKA,需要temporary。…

    数据库 2023年6月16日
    0127
  • 关于缓存一致性协议、MESI、StoreBuffer、InvalidateQueue、内存屏障、Lock指令和JMM的那点事

    前言 事情是这样的,一位读者看了我的一篇文章,不认同我文章里面的观点,于是有了下面的交流。 可能是我发的那个狗头的表情,让这位读者认为我不尊重他。于是,这位读者一气之下把我删掉了,…

    数据库 2023年6月16日
    0122
  • 系统发布springboot项目

    首先把项目终止服务,但这样的做法不是很好,也可以来个配置文件 1.查看运行的java文件有哪些,位置在哪里,端口号是多少 ps -ef | grep java 2.结束端口进程的运…

    数据库 2023年6月6日
    0109
  • 程序设计之设计模式介绍

    一、什么是设计模式? 答:程序都是通过写代码来实现的,老前辈们在开发程序的过程中,为了解决某一类问题,日积月累总结出了一套套的代码编写经验,通过这些经验,按照套路出牌,可以让开发出…

    数据库 2023年6月14日
    0103
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球