红黑树添加删除

上一篇写了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)

大家都在看

  • leetcode 208. Implement Trie (Prefix Tree) 实现 Trie (前缀树) (中等)

    Trie(发音类似 “try”)或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼…

    数据库 2023年6月16日
    094
  • 电商项目:玩转拼团活动营销设置

    拼团是什么意思?拼团是各大购物平台近两年新增的一种营销活动工具,买家通过自身分享邀请好友组团,成团后享受卖家商品的让利,商家不用过多宣传就能很好地解决产品推广和引流问题。 拼团的发…

    数据库 2023年6月14日
    071
  • oracle 怎么查看用户对应的表空间

    oracle 怎么查看用户对应的表空间? 查询用户: 查看数据库里面所有用户,前提是你是有 dba 权限的帐号,如 sys,system: select * from dba_us…

    数据库 2023年6月14日
    074
  • SQL中针对不规范数字order by排序的处理方式

    在操作数据库的时候经常需要order by进行排序,但是有的时候数据并没有很好的格式化导致排序的结果不合我们的心意,如下图: 如果我们要按照value进行排序的话,就会得到上面截图…

    数据库 2023年5月24日
    0103
  • neo4j数据库数据转移,从阿里云转移到windows服务器

    neo4j数据库数据从阿里云转移到windows 1.从阿里云迁移neo4j时需停掉neo4j数据库,在neo4j的bin目录下输入 ./neo4j stop 2.将数据备份到一个…

    数据库 2023年6月6日
    066
  • MySQL存储引擎

    一、MySQL体系结构 1. 连接层 顶层是多个客户端和链路服务,主要完成一些类似的连接处理、授权认证、以及相关的安全解决方案。该服务器还将为每个客户提供安全保护 [En] The…

    数据库 2023年5月24日
    072
  • AQS源码阅读

    AQS-获取资源: AQS-释放资源: posted @2022-06-22 17:07 無名之徒 阅读(9 ) 评论() 编辑 Original: https://www.cnb…

    数据库 2023年6月16日
    0100
  • InnoDB数据存储结构

    MySQL服务器上 存储引擎负责对表中数据的读取和写入工作,不同存储引擎中 &#x5…

    数据库 2023年5月24日
    063
  • Mysql面试总结

    转载自:https://www.cxyxiaowu.com/16302.html Q1:MySQL 的逻辑架构了解吗? 第一层是服务器层,主要提供连接处理、授权认证、安全等功能。 …

    数据库 2023年5月24日
    097
  • Oracle 备份与恢复 (Docker部署版)

    Oracle 备份与恢复 (Docker部署版) 一,宿主机设置定时备份脚本 1.检查Oracle容器是否正常运行 docker ps 2.进入容器,创建shell脚本 #orac…

    数据库 2023年6月11日
    095
  • 加班整理出来的MySQL数据库基本操作送给大家,非常详细!

    哈喽兄弟们,中秋闲着没事,整理了一些数据库的基本操作,分享给大家,希望对大家有所帮助~ ; 一、SQL语句 (mysql 数据库中的语言) show databases;查看数据库…

    数据库 2023年6月14日
    098
  • 无根用户管理podman

    在允许没有root特权的用户运行Podman之前,管理员必须安装或构建Podman并完成以下配置 基础设置 cgroup V2Linux内核功能允许用户限制普通用户容器可以使用的资…

    数据库 2023年6月14日
    076
  • CentOS服务器的网络配置与部署

    1.系统安装与软件安装 1.1选择CentOs7.9release版本用作所研发系统部署服务器,官网以及所选择镜像为地址为:http://ftp.sjtu.edu.cn/cento…

    数据库 2023年6月6日
    087
  • ASP.NET Core Docker部署

    前言 在前面文章中,介绍了 ASP.NET Core在 macOS,Linux 上基于Nginx和Jexus的发布和部署,本篇文章主要是如何在Docker容器中运行ASP.NET …

    数据库 2023年6月11日
    0112
  • bat 脚本启用及禁用网卡

    启用网卡 需要以管理员身份运行bat脚本 netsh interface set interface "Npcap Loopback Adapter" enab…

    数据库 2023年6月9日
    0122
  • day01-需求分析和系统设计

    对传输数据的分析: 因为在通讯的时候信息的种类和信息比较多,如果使用文本的方式来传递数据,那么服务器拿到信息的时候对其进行拆解会很麻烦。因此使用对象的方式来进行数据的传输(同时使用…

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