红黑树插入删除流程(流程图)

红黑树插入删除流程(流程图)

红黑树性质

  • 左根右(二叉树)
  • 根叶黑(根节点是黑色的)
  • 不红红(不存在相邻两个红色节点)
  • 黑路同(对于每个节点,从该节点出发到任一空叶节点所经过的黑节点数目相同);
  • 同时认为每个叶节点(NIL节点)是黑色

插入流程

  • 首先按照二叉树排序树的规则确定要插入的位置(要插的位置一定是叶节点,即假设和二叉排序树一样不做调整,插入后一定是叶节点)
  • 若新节点是根节点,染为黑色,结束
  • 否则默认先染为红色,这时判断它的父节点是不是红色(是否破坏不红红规则)
    • 若没有破坏不红红规则,结束
    • 破坏了不红红规则(父节点是红色),接下来看叔叔节点的脸色行事
      • 黑叔,旋转+染色:LL/RR型,父爷颜色对换+左/右单旋;LR/RL型,儿爷颜色对换+左右/右左双旋;结束
      • 红树,染色+变新:叔、父、爷都进行颜色更换,爷点变为新节点,向上检查(若此时新节点为黑色则结束,若红色则重新开始以新节点的视角进行调整)

补充:当插入一个新节点时,因为新节点是红色的,因此可能会破坏性质3(没有两个相邻的红色节点)或性质2(根节点是黑色的),但不会破坏其他性质。所以除开新节点是根的情况,插入过程中只需要看是否破坏了“不红红”的规则。

在这里插入图片描述

删除流程

删除黑色节点的时候会破坏黑路同的规则,为了便于理解调整的过程,引入标记概念(当前是哪个点破坏了红黑树的规则),后面调整的时候的任务就是清除标记。所以说如果删除的是没有孩子的黑色节点,就会出现标记。

同时便于描述,记符号r为兄弟节点的红孩子,s为兄弟节点,p为父节点。此外,LL,RR型的节点情况和上方有些许不同:只要s是p的左孩子,r是s的左孩子,就是LL型(即使s有两个红节点);同样的,只要s是p的右孩子,r是s的右孩子,就是RR型(即使s有两个红节点)

  • 先查找,确定要删除的节点,看要删除的节点是否是叶子节点?
  • 不是叶子节点
    • 左右子树都存在,则进行直接后继/前驱代替值,然后改为删除替换的节点,然后回到上一步看要删除的节点是否是叶子节点。
    • 只有左孩子/右孩子,则用孩子代替后变黑,结束。(这里只有单个孩子的情况下,只能是当前节点是黑色,孩子是红色,不会是其他情况,否则就破坏了黑路同或者不红红的规则)
  • 是叶子节点,则看节点的颜色?
    • 红节点,直接删除,结束
    • 黑节点,删除后变空节点,同时附上标记,接下来看兄弟的脸色行事?
      • 红兄弟:兄父颜色对换,朝标记点旋转,回到上一步,继续看标记节点的脸色行事
      • 黑兄弟,看兄弟有几个红孩子?
        • 至少一个红孩子:看r,s,p形状(LL,RR,LR,RL)进行变色+旋转
          • LL型:r变s,s变p,p变黑,右旋,清除标记
          • RR型:r变s,s变p,p变黑,左旋,清除标记
          • LR型:r变p,p变黑,左旋右旋,清除标记
          • RL型:r变p,p变黑,右旋左旋,清除标记
        • 没有红孩子:兄弟变红,标记向父转移,再看标记现在是否是红节点或根节点?
          • 是红节点或根节点,节点直接变黑,清除标记
          • 是黑节点,回到上上步,继续看标记节点的脸色行事

在这里插入图片描述

实践

实践是检验真理的唯一标准。由于部分过程文字描述的不够形象,特别是旋转部分,所以推荐使用可视化红黑树进行对比学习,点这里。

这里给出数据进行学习:

  • 插入:20,10,5,30,40,57,3,2,4,35,25,18,22,23,24,19,18
  • 删除:先构建出来{15,9,18,6,13,17,27,10,23,34,25,37},再按一下顺序删除{18,25,15,6,13,37,27,17,34,9,10,23}

推荐学习资源:

红黑树 - 删除

王道数据结构笔记03-红黑树/RBT

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/759066.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

收银系统源码-千呼新零售【全场景收银】

千呼新零售2.0系统是零售行业连锁店一体化收银系统,包括线下收银线上商城连锁店管理ERP管理商品管理供应商管理会员营销等功能为一体,线上线下数据全部打通。 适用于商超、便利店、水果、生鲜、母婴、服装、零食、百货、宠物等连锁店使用。 详细介绍请…

intellij idea中使用R语言plot画图无图像问题

1、在intellij idea中使用R语言plot函数时,会遇到各种各样的问题,会出现图片不显示问题, 可以看到,目前我电脑r语言版本为4.2.1,输入下面代码: # # 安装包 # install.packages(ggplot2) # library(ggplot2…

理解MySQL核心技术:外键的概念作用和应用实例

引言 在数据库管理系统(DBMS)中,外键(Foreign Key)是维持数据一致性和实现数据完整性的重要工具。本文将详细介绍MySQL外键的基本概念、作用,以及相关的操作指南和应用实例,帮助读者掌握并灵活…

实现了Map接口的HashMap

HashMap 底层主要由以下几个部分组成&#xff1a; 数组 (Node<K,V>[] table): 这是一个数组&#xff0c;存储的是链表的头节点。默认大小为 16。链表 (Linked List): 当发生哈希冲突时&#xff0c;即不同的键具有相同的哈希值&#xff0c;HashMap 使用链表来解决冲突。链…

2024年06月CCF-GESP编程能力等级认证Scratch图形化编程一级真题解析

本文收录于《Scratch等级认证CCF-GESP图形化真题解析》专栏,专栏总目录:点这里,订阅后可阅读专栏内所有文章。 一、单选题(每题 3 分,共 30 分) 第1题 小杨父母带他到某培训机构给他报名参加 CCF 组织的 GESP 认证考试的第 1级,那他可以选择的认证语言有几种?( ) A、…

C++ | Leetcode C++题解之第204题计数质数

题目&#xff1a; 题解&#xff1a; class Solution { public:int countPrimes(int n) {vector<int> primes;vector<int> isPrime(n, 1);for (int i 2; i < n; i) {if (isPrime[i]) {primes.push_back(i);}for (int j 0; j < primes.size() && i …

百度网盘下载速度慢的解决办法

目录 一、背景 二、解决办法 1、点击三个竖点&#xff0c;再点设置 2、点击传输&#xff0c;再点击去开启该功能 3、点击同意&#xff0c;开启优化速率 三、结果 四、备注 一、背景 当你不是百度网盘会员时&#xff0c;你在使用百度网盘下载时&#xff0c;是否下载速度太…

isalnum()方法——判断字符串是否由字母和数字组成

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 语法参考 isalnum()方法用于判断字符串是否由字母和数字组成。isalnum()方法的语法格式如下&#xff1a; str.isalnum() 如果字符串中至少有一个字…

缺少msvcp140一键修复方法,快速解决msvcp140.dll丢失问题

日常中电脑已经成为我们生活和工作中不可或缺的工具。然而&#xff0c;在使用电脑的过程中&#xff0c;我们常常会遇到一些问题&#xff0c;其中之一就是电脑运行软件时提示找不到msvcp140.dll。这个问题会导致软件无法启动运行&#xff0c;但只要我们了解其原因并采取相应的解…

六月,允许自己做自己,别人做别人

今天结束后&#xff0c;2024 就过去一半了。 年初的规划完成一半了吗&#xff1f;如果没有也没关系&#xff0c;做你自己继续前进。 家人来北京旅游&#xff0c;我累趴了 六月初&#xff0c;我搬家了&#xff0c;这次租了一整套房&#xff0c;是一个小俩居、还带一个小阁楼。…

鸿蒙如何打包应用程序

总结鸿蒙应用程序包 之前文章详细讲解了关于三种程序包的内容&#xff0c;现在简单总结一下&#xff1a; 1. 总结 首先需要搞清楚鸿蒙项目的模块Module的分类: Module分为“Ability”和“Library”两种类型 HAP HAP: Harmony Ability Package , 叫做鸿蒙Ability包。 “Abil…

静态时序分析:ideal_clock、propagated_clock以及generated_clock的关系及其延迟计算规则(二)

相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm1001.2014.3001.5482 生成时钟 上一节中&#xff0c;我们讨论了理想时钟和传播时钟的创建和使用&#xff0c;本节将讨论生成时钟及其与理想时钟和传播时钟的关系。 图1所示的是一个简…

权限维持-域环境单机版---映像劫持(多)

目录 映像位置: 测试&#xff1a;执行 notepad 成 cmd 配合GlobalFlag隐藏-->执行正常关闭后触发 映像位置: 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\notepad.exe 测试&#xff1a;执行 notepad 成 cmd…

Python和MATLAB粘性力接触力动态模型半隐式欧拉算法

&#x1f3af;要点 &#x1f3af;运动力模型计算制作过程&#xff1a;&#x1f58a;相机捕捉网球运动图&#xff0c;制定运动数学模型&#xff0c;数值微分运动方程 | &#x1f58a;计算运动&#xff0c;欧拉算法离散积分运动&#xff0c;欧拉-克罗默算法微分运动方程 &#…

VSCode + GDB + J-Link 单片机程序调试实践

VSCode GDB J-Link 单片机程序调试实践 本文介绍如何创建VSCode的调试配置&#xff0c;如何控制调试过程&#xff0c;如何查看修改各种变量。 安装调试插件 在 VSCode 扩展窗口搜索安装 Cortex-Debug插件 创建调试配置 在 Run and Debug 窗口点击 create a launch.json …

05 threeJs基础---阵列立方体和相机适配体验立方体

1.增加相机视角fov 注&#xff1a; 范围更大&#xff0c;意味着可以看到渲染范围更大&#xff0c;远小近大的视觉效果更明显 fov:眼球张开的角度&#xff0c;0时相当于闭眼。aspect:可视区域横纵比。near:眼睛能看到的最近垂直距离。far&#xff1a;眼睛能看到的最远垂直距离。…

12-Django项目--Ajax请求三

目录 路由 添加与编辑 视图函数 perform_list.html 路由 添加与编辑 视图函数 perform_list.html {% endblock %}{% block js %}<script>var DELETE_ID undefined;var MODIFY_ID undefined;$(function () {bindBtnAdd();bindBtnSave();bindBtnDelete();bindBtnDelet…

ESP32-S3[Wire.cpp:513] requestFrom(): i2cRead returned Error -1报错问题

前言&#xff1a; esp32本来是用的ESPWroom32&#xff0c;连接NFC模块&#xff0c;测试完功能是没有问题的&#xff0c;但是换成ESP32-S3&#xff0c;就会报这个错。 报错代码 EPSWroom32 ESP32-S3 解决办法 其实问题就出再ESP32-S3要多一步初始化I2C的代码&#xff0c;初始…

跟《经济学人》学英文:2024年6月22日这期 The exponential growth of solar power

The exponential growth of solar power will change the world An energy-rich future is within reach 原文&#xff1a; It is 70 years since AT&T’s Bell Labs unveiled a new technology for turning sunlight into power. The phone company hoped it could rep…

Python pip install模块时C++编译环境问题

pip install模块时C编译环境问题 在接触和使用python后&#xff0c;常常会通过pip install命令安装第三方模块&#xff0c;大多数模块可以直接安装&#xff0c;但许多新同学仍会遇见某些模块需要实时编译后才能安装&#xff0c;如报错信息大概是缺乏C编译环境&#xff0c;本文则…
最新文章