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

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

红黑树性质

  • 左根右(二叉树)
  • 根叶黑(根节点是黑色的)
  • 不红红(不存在相邻两个红色节点)
  • 黑路同(对于每个节点,从该节点出发到任一空叶节点所经过的黑节点数目相同);
  • 同时认为每个叶节点(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.rhkb.cn/news/365105.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

==和equals的区别(面试题)

和equals有什么区别 对于基本数据类型,比较的是值是否相等,对于引用类型则是比较的地址是否相等;对于equals来说,基本数据类型没有equals方法,对于引用类型equals比较的是引用对象是否相同 那针对以上结论&#xff0c…

基于模糊神经网络的时间序列预测(以hopkinsirandeath数据集为例,MATLAB)

模糊神经网络从提出发展到今天,主要有三种形式:算术神经网络、逻辑模糊神经网络和混合模糊神经网络。算术神经网络是最基本的,它主要是对输入量进行模糊化,且网络结构中的权重也是模糊权重;逻辑模糊神经网络的主要特点是模糊权值可…

Web后端开发概述环境搭建项目创建servlet生命周期

Web开发概述 web开发指的就是网页向后再让发送请求,与后端程序进行交互 web后端(javaEE)程序需要运行在服务器中 这样前端才可以对其进行进行访问 什么是服务器? 解释1: 服务器就是一款软件,可以向其发送请求,服务器会做出一个响应.可以在服务器中部署文件,让…

pytest-作用域

固件的作用是为了抽离出重复的工作和方便复用,为了更精细化控制固件(比如只想对数据库访问测试脚本使用自动连接关闭的固件),pytest 使用作用域来进行指定固件的使用范围。 在定义固件时,通过 scope 参数声明作用域&a…

专业指南:U盘数据恢复全攻略

一、引言:U盘数据恢复的重要性 在信息化日益发展的今天,U盘已成为我们日常生活中不可或缺的存储设备。然而,由于各种原因,U盘中的数据可能会面临丢失的风险。U盘数据恢复技术便应运而生,它旨在帮助用户找回因误删除、…

Unity制作一个简单抽卡系统(简单好抄)

业务流程:点击抽卡——>播放动画——>显示抽卡面板——>将随机结果添加到面板中——>关闭面板 1.准备素材并导入Unity中(包含2个抽卡动画,抽卡结果的图片,一个背景图片,一个你的展示图片) 2.给…

【前端】简易化看板

【前端】简易化看板 项目简介 看板分为三个模块,分别是待办,正在做,已做完三个部分。每个事件采取"卡片"式设计,支持任务间拖拽,删除等操作。 代码 import React, { useState } from react; import { Car…

通用管理页面的功能实现

在Windows Forms(WinForms)应用程序中,创建一个通用的管理页面通常涉及对数据的增删改查(CRUD)操作,以及一些额外的功能,如数据过滤、排序、导出和导入等。 先看一个仓库管理页面要素。 仓库管…

Redis-主从复制-测试主从模式下的读写操作

文章目录 1、在主机6379写入数据2、在从机6380上写数据报错3、从机只能读数据,不能写数据 1、在主机6379写入数据 127.0.0.1:6379> keys * (empty array) 127.0.0.1:6379> set uname jim OK 127.0.0.1:6379> get uname "jim" 127.0.0.1:6379>…

windows@文件高级共享设置@网络发现功能@从资源管理器网络中访问远程桌面

文章目录 高级共享设置常用选项其他选项操作界面说明 网络类型检查和设置(专用网络和公用网络)👺Note 高级共享设置和防火墙👺命令行方式使用图形界面方式配置 网络发现网络发现功能的详细介绍网络发现的作用👺网络发现的工作原理启用和配置网…

无水印视频素材库有哪些?高清无水印素材网站分享!

在这个数字化时代,短视频创作已成为流行趋势。为了让您的视频内容更具吸引力,选择合适的无水印高清视频素材至关重要。今天,我将向您推荐几个优秀的视频素材库,这些资源网站将大大提高您的创作效率和视频质感。 蛙学素材网&#…

WP黑格导航主题BlackCandy

BlackCandy-V2.0全新升级!首推专题区(推荐分类)更多自定义颜色!选择自己喜欢的色系,焕然一新的UI设计,更加扁平和现代化! WP黑格导航主题BlackCandy

C++ 现代教程二

线程支持库 - C中文 - API参考文档 GitHub - microsoft/GSL: Guidelines Support Library Fluent C&#xff1a;奇异递归模板模式&#xff08;CRTP&#xff09; - 简书 #include <thread> #include <iostream> #include <unordered_map> #include <futu…

【计算机网络仿真】b站湖科大教书匠思科Packet Tracer——实验10 IPv4地址 — 构造超网(无分类编址)

一、实验目的 1.加深对构造超网的理解&#xff1b; 二、实验要求 1.使用Cisco Packet Tracer仿真平台&#xff1b; 2.观看B站湖科大教书匠仿真实验视频&#xff0c;完成对应实验。 三、实验内容 1.构建网络拓扑&#xff1b; 2.根据各网络所指定的地址块完成以下工作&#…

pytest测试框架pytest-cov插件生成代码覆盖率

Pytest提供了丰富的插件来扩展其功能&#xff0c;本章介绍下pytest-cov插件&#xff0c;用于生成测试覆盖率报告&#xff0c;帮助开发者了解哪些部分的代码被测试覆盖&#xff0c;哪些部分还需要进一步的测试。 pytest-cov 支持多种报告格式&#xff0c;包括纯文本、HTML、XML …

Studying-代码随想录训练营day24| 93.复原IP地址、78.子集、90.子集II

第24天&#xff0c;回溯算法part03&#xff0c;牢记回溯三部曲&#xff0c;掌握树形结构结题方法&#x1f4aa; 目录 93.复原IP地址 78.子集 90.子集II 总结 93.复原IP地址 文档讲解&#xff1a;代码随想录复原IP地址 视频讲解&#xff1a;手撕复原IP地址 题目&#xff1…

音视频入门基础:H.264专题(4)——NALU Header:forbidden_zero_bit、nal_ref_idc、nal_unit_type简介

音视频入门基础&#xff1a;H.264专题系列文章&#xff1a; 音视频入门基础&#xff1a;H.264专题&#xff08;1&#xff09;——H.264官方文档下载 音视频入门基础&#xff1a;H.264专题&#xff08;2&#xff09;——使用FFmpeg命令生成H.264裸流文件 音视频入门基础&…

微服务-网关Gateway

个人对于网关路由的理解&#xff1a; 网关就相当于是一个项目里面的保安&#xff0c;主要作用就是做一个限制项。&#xff08;zuul和gateway两个不同的网关&#xff09; 在路由中进行配置过滤器 过滤器工厂&#xff1a;对请求或响应进行加工 其中filters&#xff1a;过滤器配置…

docker配置国内镜像加速器

1、搜索阿里云 2、搜索容器镜像服务 点击管理控制台 配置镜像加速器

【ARM CoreLink 系列 7.2 -- TZC-400 错误状态寄存器使用详细介绍】

文章目录 TZC-400 错误信息使用Fail address low registerFail address high registerFail control registerFail ID registerTZC-400 错误信息使用 Fail address low register 在 ARM TZC-400 设备中,每个过滤单元都有一个 fail_address_low_<x> 寄存器,其中 <x&g…