【高级数据结构】红黑树

news2025/1/19 20:31:35

本文整理红黑树学习过程中的知识点和底层代码实现。

目录

  • 基本概念
    • 1、介绍
    • 2、应用
    • 3、性质
  • 实现红黑树
    • 1、原理
    • 2、操作
      • 1)查找
      • 2)插入
      • 3)删除
  • 和其他相似结构的对比
    • 1、二叉搜索树(BST)
    • 2、AVL树
      • 1)例子
      • 2)插入
      • 3)删除
      • 4)搜索
      • 5)结论

基本概念

1、介绍

红黑树 又叫对称二叉B树,是一种自平衡的二叉搜索树,因其插入、搜索、删除节点的效率都比较高而被广泛引用。

2、应用

  1. Linux下IO多路复用epoll 的实现采用红黑树组织管理 sockfd,以支持快速的增删改查,时间复杂度为O(log(n));
  2. ngnix中,用红黑树管理timer,因为红黑树是有序的,可以很快的得到距离当前最小的定时器.

3、性质

利用二叉搜索树可以简化对树中某个节点的查找,使平均情况下的时间复杂度从O(n)降到O(log(n)),但是普通的二叉搜索树在极端情况下可退化成链表,如下图:

在这里插入图片描述
此时的增删查效率都很低,为了应对这个问题,出现了许多加入自平衡机制的搜索树(详细可见本文最后一节),红黑树就是其中一种。

红黑树按照如下性质实现自平衡:

  1. 节点是红色或者黑色
  2. (root)必是黑色;
  3. 叶子节点都为NULL且为黑色
  4. 每个红色节点必须有两个黑色的子节点,所以保证了每个叶子节点到根节点之间的路径上不能有两个连续的红色节点
  5. 任意节点其每个叶子节点所有路径上都包含相同数量的黑色节点
  6. 新增加的节点为红色,因为这样效率高。

例子如下:
在这里插入图片描述

实现红黑树

1、原理

由上述红黑树的性质可推出如下性质:

从根节点到叶子节点的最长路径不大于最短路径两倍

最短路径:由规则5可得 只有黑色节点的路径是最短路径(整条路径上没有红色节点)
最长路径:同理,黑红相间的路径必是最长路径,此时黑色节点数量是红色节点数量+1。

通过以上性质构建出来的树即为红黑树,这些性质在进行增删查操作的过程中都会被使用到。

2、操作

在讨论红黑树增删查操作之前,先确定一些基本概念
1、树上节点关系,图片来源 b站谢某人er红黑树解说

2、插入元素节点颜色为红色,是为了更轻易修复红黑树的性质。
3、前驱:左子树中值最大的节点,后继:右子树中值最小的节点。
4、前驱和后继都是数值上最接近该节点的节点,在一些情况下需要用它们来替代删除节点(如果同时有前驱和后继,任意一个来替代删除节点都可以)。

1)查找

此过程与二叉搜索树完全一致,不再赘述,时间复杂度为O(log(n))

2)插入

在这里插入图片描述
(图片来自黑马程序员视频教程)

3)删除

删除节点的工作主要分为两部分:

  1. 先根据二叉搜索树的性质,找到要删除的节点;
  2. 删除该节点后,修复树的红黑性质。

与删除二叉搜索树节点相同,删除红黑树节点时也只需要考虑子节点个数,但额外需要考虑被删节点的颜色。

情况1:被删节点无子节点,且被删节点为红色

直接删除即可,不会破坏红黑性质。


情况2:被删节点无子节点,且被删节点为黑色

此时删除该节点必然会破坏性质5,所以删除后通过兄弟节点及其子树(一定存在)的情况来修复红黑性质。过程比较复杂,此处不展开。详细可参考 CSDN nguliu 的博文。

情况3:被删节点有一个子节点,且被删节点为黑色

此时被删节点的子节点必为红色,此时将该节点删去,用其子节点替换被删节点即可,之后将子节点变黑即可。

情况4:被删节点有两个子节点,且被删节点为黑色或红色

先确定被删节点的前驱或者后继,然后用前驱或后继替换被删节点,删除操作完成后,会转为其他情况,然后按上述情况解决即可。

和其他相似结构的对比

1、二叉搜索树(BST)

红黑树的存在就是为了解决二叉搜索树在极端情况下会退化成链表的的问题。

在增删查的操作上。红黑树与BST相似,只是要增加一些颜色的变换以及因为颜色变换而变多的恢复情况。

2、AVL树

1)例子

在这里插入图片描述

对应的相同数据的红黑树(可视化省略了叶子节点):
在这里插入图片描述

2)插入

AVL利用平衡因子来使得左右子树的高度差不大于1,所以当插入元素引起树不平衡时只需要考虑旋转来平衡左右子树,并且最多只需要两次旋转就可完成,时间复杂度O(1)

而红黑树同样也需要最多两次旋转,但还需要考虑颜色变换时间复杂度也是O(1)

3)删除

AVL通常需要往上回溯多个节点的节点,时间复杂度为O(log(n))。

红黑树最多只需要三次旋转,时间复杂度O(1)。

4)搜索

通过上述例子可以发现,AVL的搜索稳定性要大于红黑树(左右子树高度差一定小于等于1),而红黑树左右子树的高度差范围更大(可以等于2,此时左右子树可以相差一个黑节点和一个红节点)。

5)结论

若业务需要大量的插入和删除(例如epoll中的sockfd),红黑树效率更高,如果删除操作较少,AVL效率更高。

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

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

相关文章

Dubbo+Zookeeper 实现服务远程调用

文章目录 一、Dubbo 架构图二、Zookeeper 注册中心三、SpringBoot 整合 Dubbo3.1 添加依赖3.2 配置服务端3.3 配置消费端3.4 启动测试 四、Dubbo-admin 管理中心4.1 部署服务端4.2 部署前端4.3 访问控制台 提示:以下是本篇文章正文内容,Java 系列学习将会…

Visual Assist X安装失败解决办法

最近重装了VS2017,在重装之前卸载了VA助手,但是等到装好VS再去装VA助手时,总是提示以下错误信息: Visual Assist Installer : An error was reported by Visual Studio VSIXInstaller. See the next window for access to its err…

ElasticJob

官网 :: ElasticJob ElasticJob 是面向互联网生态和海量任务的分布式调度解决方案,由两个相互独立的子项目 ElasticJob-Lite 和 ElasticJob-Cloud 组成。 它通过弹性调度、资源管控、以及作业治理的功能,打造一个适用于互联网场景的分布式调度解决方案&…

如何给厂区做导航地图?智能工厂导航地图解决方案公司

如何给厂区做导航地图?在智慧园区中,基于园区的电子地图地图使用的重要性越来越凸显。但目前在园区信息化应用形式中,广泛缺乏专业电子地图的使用,主要原因是:一是地图系统(GIS)实现繁复,与其他展会业务系统…

GateWay微服务网关的搭建

服务网关 没有服务网关 问题:地址太多|安全性|管理问题 访问商品服务 http://ip地址:9001/goods/findAll 访问广告服务 http://ip地址:9002/brand/findAll 访问用户服务 http://ip地址:9003/user/findAll 在有网关的情况下,我们配置网关端口号为…

Vue2之webpack篇(二)Loader

目录 一、loader处理css 1、css文件的创建 2、安装css-loader 3、配置 4、打包 5、最终效果 二、loader处理图片 1、引入图片 2、安装file-loader 3、配置module 4、webpack打包 三、ES6转ES5 1、介绍 2、安装babel-loader 3、webpack.config.js配置 4、webpack打…

C++数据结构:二叉树

二叉树 每个结点最多只有二棵子树,也就是二叉树中没有度大于2的结点。二叉树的子树有左右之分,严格区分左孩子、右孩子,其次序不能颠倒 二叉树五种基本形态 特殊二叉树 斜树 所有节点都只有左子树的二叉树叫做左斜树,所有节点都…

SAP ABAP 创建后台定时任务job

定时任务的事务码 sm36:创建定时任务 sm37:查看定时任务 JDBG:后台任务debug,在对应的sm37中对应的job页面 t-code输入 创建定时任务SM36 1、名称可以随便起一般都是按自己公司业务情况来,比如我这个就是哪一个报表的定时任务,做的是什么操作&#xf…

Python 全栈系列220 Tornado的服务搭建

说明 想法变的真快 本来是没打算用Tornado的,主要是想节约时间。但是现在看来不用还是不行:目前用gevent flask部署的时候,启动多核的worker似乎存在问题。 另外,有很多内部基础的数据服务,其实并不需要flask的各种组…

如何使用镭速保护云存储数据安全

近年来,随着云计算的发展,远程系统上的数据存储变的越来越重要。云存储是一个以数据存储和管理为核心的云计算系统,给我们提供了一种全新的数据信息存储模式。但是,可以从全球任何地方访问和检索相同的数据。所需要的只是一个简单…

ZooKeeper分布式应用程序协调服务

目录 一.ZooKeeper基本介绍 1.ZooKeeper是什么? 2.ZooKeeper的工作机制 3.ZooKeeper的特点 4.ZooKeeper的数据结构 5.ZooKeeper的应用场景 5.1 统一命名服务 5.2 统一配置管理 5.3 统一集群管理 5.4 服务器动态上下线 5.5 软负载均衡 二.ZooKeeper的选举…

EasyConnect登陆报错:拉起虚拟网卡失败,请确保虚拟网卡已经安装在系统上并处于启用状态,然后再重新登录解决此问题。

目录 项目场景: 问题描述 原因分析: 解决方案: 1. 搜索设备管理器,打开/或者打开此电脑-(顶部)计算机-属性-设备管理器进入 2. 进入设备管理器,找到网络适配器,双击网络适配器…

【云原生】k8s Service 实现服务发现和负载均衡

文章目录 前言Service 介绍Service 的四种类型及使用方式Service 的定义和使用通过命令创建服务查看创建的服务情况 不指定 Selectors 的服务Headless 服务Service 工作原理及原理图Ingress 讲解集群外部如何访问服务总结 前言 在容器编排系统中,如 Kubernetes&…

Anaconda + TensorFlow Winodws环境安装(Windows Terminal / Visual Studio / VS code)

目录 前言个人环境 Anaconda安装下载安装测试添加到windows terminal TensorFlow环境配置安装测试 搭配Visual Studio 2022搭配VS Code 前言 以前发生的一些事情,让我认识到即便配环境这种事情,最好还是把自己的过程存个档 ,这个的安装虽然简…

前端HTML、CSS--11(CSS-8)

目录: CSS3 属性选择器 CSS3 结构伪类选择器 CSS3 伪元素选择器 CSS3 2D转换 CSS3 动画 CSS3 3D转换 浏览器私有前缀 4. 2D转换 转换(transform)是CSS3中具有颠覆性的特性之一,可以实现元素的位移、旋转、缩放等效果。 转…

技术引领,创邻科技Galaxybase亮相2023数据技术嘉年华

2023年4月7日-8日,由中国DBA联盟(ACDU)和墨天轮社区联合主办的第十二届『数据技术嘉年华』(DTC2023)在北京举办。本次大会以“开放融合数智化——引领数据技术发展,释放数据要素价值”为主题,从…

线下活动 | 探索现代服务业的人效提升之路

3月25日,盖雅搞得定系列活动-卓越管理闭门分享会圆满落幕。此次活动主题定为「探索服务业的人效提升之路」,20余位现代服务业企业代表参与了此次活动,共同探讨如何利用数字化工具赋能企业管理,促进人效提升。招商积余人力负责人谢…

仿函数详解

目录 1、函数对象 2、谓词 2.1、一元谓词(谓词有一个参数) 2.1.1、普通函数提供策略 2.1.2、仿函数(上面的函数调用)提供策略 2.1.3、一元谓词全部代码 2.1、二元谓词(谓词有两个参数) ​编辑 3、内…

Ansys Zemax | 如何模拟 LED 及其它复杂光源

概述 在使用非序列时,对照明系统进行精确模拟的第一步总是要正确建立光源模型。OpticStudio 提供了多种精确模拟光源的方法。这篇文章介绍了如何在非序列模式下使用径向光源 (Source Radial), 光源文件 (Source File) 以及通过建立其他复杂几何体,来对le…

Oracle与Mysql求连续天数的数据

问题:最近有开发需求,查询最近一个月连续天数>2的数据项,我这里数据库日期存储的是yyyymmdd,字符串 (可自行根据自身情况修改) 思路:如果可以找到连续日期的开始与结束时间,那么就可以 where 日期 betw…