数据结构===红黑树

文章目录

  • 概要
  • 满足的条件
  • 基本思想
  • 操作
    • 红黑树的插入
    • 红黑树的删除
    • 遍历操作
  • 代码C++
  • 小结

概要

这篇说下红黑树
其实,红黑树,对于我来说,比较重要的几点。

  1. 满足几个条件
  2. 基本思想
  3. 插入
  4. 删除

这些是很重要的。


满足的条件

红黑树需要满足什么条件呢?
应该有四个,如下:

  1. 节点非黑既红
  2. 根节点是黑色
  3. 叶子(NIL)结点是黑色
  4. 红色节点下面接两个黑色节点
  5. 从根节点到叶子结点路径上,黑色节点数量相同

基本思想

这个,除了上边四个条件;还要有2个操作,左旋和右旋。
有了这些条件,再加上左旋右旋操作,接下来看看红黑树的插入,删除。


操作


红黑树的插入

  1. 叔叔节点为红色的时候,修改三元组小帽子,改成红黑黑
  2. 叔叔节点为黑色的时候,参考 AVL 树的失衡情况,分成 L L , L R , R L , R R LL,LR,RL,RR LL,LR,RL,RR, 先参考 AVL 树的旋转调整策略,然后再修改三元组的颜色,有两种调整策略:红色上浮,红色下沉。
  3. 两大类情况,包含 8 种小情况

红黑树的删除

  1. 删除红色节点,不会对红黑树的平衡产生影响
  2. 度为1的黑色节点,唯一子孩子,一定是红色
  3. 删除度为1的黑色节点,不会产生删除调整
  4. 删除度为0的黑色节点,会产生一个双重黑的 NIL 节点
  5. 删除调整,就是为了干掉双重黑

删除调整:

  1. 双重黑节点的兄弟节点是黑色,兄弟节点下面的两个子节点也是黑色,父节点增加一重黑色,双重黑与兄弟节点,分别减少一重黑色。

  2. 兄弟节点是黑色,并且,兄弟节点中有红色子节点

    1. R(兄弟)R(右子节点),左旋,新根改成原根的颜色,将新根的两个子节点,改成黑色
    2. R(兄弟)L(左子节点),先小右旋,对调新根与原根的颜色,转成上一种情况
    3. LL 同理 RR
    4. LR 同理 RL
  3. 兄弟节点是红色,通过旋转,转变成兄弟节点是黑色的情况


遍历操作

树的遍历,都有前序,中序,后序三个操作。对于红黑树,插入,删除都是O(1)的时间复杂度。来看看代码。

代码C++

关于代码,网上版本比较多,不提供参考意见。可以看下ngx_rbtree.c,ngx_rbtree.h的实现。


小结

红黑树是一个比较复杂的数据结构。不过,还是要学习下的,可以参考下动画动画链接,这个里边有模拟插入删除的整个调整过程。有些时候看文字确实比较模糊,不容易学会儿。代码还是要看下的,可以配合一些动画。

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

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

相关文章

DE2-115开发板基于verilog和nioⅡ的流水灯实现

目录 一、 内容概要二、 实现2.1 基于Nios II软核的流水灯2.1.1 准备工作2.1.2 工程搭建2.1.3 硬件代码设计Ⅰ 连接IP核Ⅱ 编写代码Ⅲ 各种配置 2.1.4 软件代码设计Ⅰ 环境构建Ⅱ 编写代码 2.1.5 代码下载Ⅰ 硬件下载Ⅱ 软件下载 2.1.6 运行结果 2.2 Verilog流水灯 三、 心得体…

带你探索CA和SSL证书

目录 一、什么是CA? 二、什么是SSL证书? 三、SSL证书分类和文件种类? 3.1 证书的分类: 3.2证书格式: 四、SSL和TSL 五、PSK介绍 六、nginx配置介绍 一、什么是CA? CA是证书的签发机构,它是…

sumif的求和区域是文本格式怎么办?

sumif函数的求和区域是文本型数字,不更改源数据的情况下怎么求和呢? 一、不能使用SUMIF、SUMIFS函数 这两个函数的求和区域只能是引用,不能是公式运算的内存数组,因此不能用公式或运算符将求和区转换成数值。当引用来的数据是文本…

公司网页设计思路

在当今互联网时代,公司网页设计是一个极为重要的环节。一款精心设计的公司网页可以提升企业形象,增加用户粘性,吸引更多的潜在客户和合作伙伴。下面将为大家介绍一些公司网页设计的思路。 首先,要确立公司网页的整体风格。网页风格…

Rust学习笔记(下)

前言 笔记的内容主要参考与《Rust 程序设计语言》,一些也参考了《通过例子学 Rust》和《Rust语言圣经》。 Rust学习笔记分为上中下,其它两个地址在Rust学习笔记(上)和Rust学习笔记(中)。 并发 线程 在…

C++的数据结构(四):队列

在数据结构中,队列(Queue)是一种特殊的线性表,只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。队列中没有元素时,称为空队列。队列的…

基于SSM的“网约车用户服务平台”的设计与实现(源码+数据库+文档)

基于SSM的“网约车用户服务平台”的设计与实现(源码数据库文档) 开发语言:Java 数据库:MySQL 技术:SSM 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能 首页 站内新闻浏览 打车信息查询功能 在线打车功能…

Java面试题:死锁的产生和诊断

死锁的产生和诊断 一个线程需要同时获取多把锁时,就容易发生死锁 eg: new Thread(()->{synchronized(A){};synchronized(B){}; }) new Thread(()->{synchronized(B){};synchronized(A){}; }) 线程持有资源并互相等待对方持有的资源 JDK自带工具 jps:输出jvm中运行…

GD32用ST-Link出现internal command error的原因及解决方法

一、GD32 F407烧录时出现can not reset target shutting down debug session 搜寻网上资料,发现解决方式多种多样,做一个简单的总结: 1.工程路径包含中文名 2.需更改debug选项 3.引脚冲突 4.杜邦线太长 而先前我的工程路径包含中文名也仍…

(Java)心得:LeetCode——18.四数之和

一、原题 给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复): …

Git在windows和Linux安装并自动更新代码超详细讲解

202405122316 一、Git官网安装 1、官网安装地址: Git - Downloading Packagehttps://git-scm.com/download/win 官网下载比较慢建议使用下面链接 2、国内镜像下载地址: CNPM Binaries Mirrorhttps://registry.npmmirror.com/binary.html?pathgit-fo…

Libcity 笔记:自定义模型

在/libcity/model/trajectory_loc_prediction/,我们复制一份Deepmove.py,得到DM_tst.py,我们不改变其中的机制,只动class name 然后修改相同目录下的__init__.py: 修改task_config文件: 在config/model/tra…

OGG几何内核-网格化的改进

OGG社区于4月19日发布了OGG 1.0 preview版本。相对于OCCT 7.7.0有很多改进,目前在持续研究中。最近测试了一下网格化,确实有很好的改进。对比展示如下: 几何内核: OGG 1.0 preview 几何内核:OCCT 7.7.0 采用OCCT几何内…

2024中国(重庆)VR/AR科技展8月举办

2024中国(重庆)VR/AR科技展8月举办 邀请函 主办单位: 中国航空学会 重庆市南岸区人民政府 招商执行单位: 重庆港华展览有限公司 展会背景: 2024中国航空科普大会暨第八届全国青少年无人机大赛在重庆举办,同时举办第二届中国…

深圳晶彩智能ESP32-1732S019实时观看GPIO的状态

深圳晶彩智能ESP32-1732S019介绍 ESP32-1732S019开发板是基于ESP32-S3-WROOM-1模块作为主控,双核MCU ,集成WI-FI和蓝牙功能,主控频率可达240MHz , 512KB SRAM , 384KB ROM,8M PSRAM,16MB Flash,显示分辨率为170*320 I…

牛津大学和上海交大将SAM和Flow应用于移动目标,简单而有效,轻松分割运动目标!

光流可以在运动物体分割中发现运动物体并为分割提供清晰的边界。然而,如果物体暂时静止,就会面临分割挑战。 而我们知道SAM可以很好的分割静态图像对象。因此,是否可以利用SAM与光流结合来在视频中进行移动物体分割? 今天给大家介…

vue3引入vant完整步骤

在Vue 3中引入Vant(一个基于Vue的移动端UI组件库)的完整步骤通常包括以下几个部分: 安装Vue CLI(如果你还没有安装的话): npm install -g vue/cli 创建一个新的Vue项目: 假设你希望项目名为my…

分享一个php常驻内存多进程任务的扩展

前言 最近在摸鱼的时候发现一个PHP常驻内存多进程任务扩展包:EasyTask: PHP常驻内存多进程任务管理器,支持定时任务(PHP resident memory multi-process task manager, supports timing tasks) (gitee.com),支持php使用多线程处理任务。之前…

重写muduo之TcpServer

目录 1、Callbacks.h 2、TcpServer.h 3、TcpServer.cc 1、Callbacks.h 回调操作 不用依赖boost库&#xff0c;全部翻译成对C11的依赖&#xff0c;与多线程相关&#xff0c;也翻译成C11,与Linux底层的API的关联性减少&#xff0c;移植性更好 #pragma once#include <memo…

PV操作大题强化

1.生产者消费者问题——进程间关系为“生产资源-消费资源” 解题步骤 分析有几类进程——每类进程对应一个函数在每一个函数内部可以用中文描述动作(如果动作只做一次&#xff0c;就不用加while循环&#xff0c;如果动作要重复&#xff0c;就要加while循环)分析每一个动作在做…