红黑树R-B Tree

news2024/9/24 11:33:55

文章目录

    • 概述
    • 红黑树的特性
    • 红黑树的原理
    • 应用
    • 为什么设计红黑树
    • 红黑树左旋与右旋的区别

概述

红黑树(Red Black Tree)是一种自平衡的二叉查找树,在计算机科学中广泛使用,其典型的用途是实现关联数组。R-B Tree,全称是 Red-Black Tree,又称为“红黑树”,它一种特殊的二叉查找树。红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black)
定义:红黑树是一种特殊的二叉查找树,它通过特定的操作(如旋转和重新着色)来保持树的平衡,从而获得较高的查找、插入和删除性能。
发明:红黑树由Rudolf Bayer在1972年发明,当时被称为平衡二叉B树(symmetric binary B-trees),后由Guibas和Robert Sedgewick修改为如今的“红黑树”。
红黑树(Red-Black Tree)是一种自平衡二叉搜索树,它在插入和删除节点时,通过规则来保证树的平衡性,从而使得树的高度保持在较低的水平。这种平衡性确保了查找、插入和删除操作的时间复杂度始终为 O(log⁡n),即使在最坏情况下

红黑树的特性

(1)每个节点或者是黑色,或者是红色
(2)根节点是黑色
(3)每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL 或NULL)的叶子节点
(4)如果一个节点是红色的,则它的子节点必须是黑色的
(5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点
红黑树必须满足以下五个性质,以维持其平衡状态:
节点颜色:每个节点要么是红色,要么是黑色。
根节点颜色:根节点是黑色。
叶子节点:所有叶子节点(NIL节点,空节点)都是黑色的。
红色节点:如果一个节点是红色的,则它的两个子节点都是黑色的(即不能有两个连续的红色节点)。
黑色节点路径:从任一节点到其每个叶子节点的所有路径都包含相同数目的黑色节点。

红黑树的原理

红黑树通过一系列复杂的操作来维持其平衡,主要包括插入和删除节点时的旋转和重新着色。
插入操作:插入新节点时,通常将其标记为红色,以避免破坏性质5。然后,通过一系列的旋转和重新着色操作,恢复红黑树的性质。
删除操作:删除节点时,可能需要通过旋转和重新着色来保持树的平衡。删除操作相对复杂,因为它可能涉及多个节点的移动和颜色的改变。
(1) 红黑树的性质:红黑树是一个二叉搜索树。在每个节点增加了一个存储位记录节点的颜色,可以是 RED,也可以是 BLACK,通过任意一条从根到叶子简单路径上颜色的约束,红黑树保证最长路径不超过最短路径的两倍,加以平衡。性质如下:
i. 每个节点颜色不是黑色就是红色
ii. 根节点的颜色是黑色的
iii. 如果一个节点是红色,那么他的两个子节点就是黑色的,
没有持续的红节点
iv. 对于每个节点,从该节点到其后代叶节点的简单路径上,
均包含相同数目的黑色节点。

应用

红黑树由于其高效的查找、插入和删除性能,在多个领域有广泛的应用,包括但不限于:
数据库索引:红黑树可以用于数据库索引的实现,以快速地进行数据的查找、插入和删除。
C++ STL容器:C++标准模板库(STL)中的map和set容器底层实现就是红黑树,这使得它们能够高效地进行元素的查找、插入和删除。
Linux内核:Linux内核中的进程调度算法使用红黑树来管理进程的优先级,以便高效地进行进程的调度。
文件系统:一些文件系统使用红黑树来管理文件的目录结构,以便快速地进行文件的查找和访问。
保证最坏情况下的性能:红黑树的高度始终保持在 O(log⁡n),即使在最坏情况下,查找、插入和删除的时间复杂度也不会退化。
广泛应用:红黑树被广泛应用于许多计算机系统和库中,例如 Java 中的 TreeMap 和 TreeSet、C++ 中的 map 和 set,以及 Linux 内核的调度器和内存管理器中

为什么设计红黑树

红黑树通过它规则的设定,确保了插入和删除的最坏的时间复杂度是 O(log N) 。
红黑树解决了 AVL 平衡二叉树的维护起来比较麻烦的问题,红黑树,读取略逊于 AVL,维
护强于 AVL,每次插入和删除的平均旋转次数应该是远小于平衡树。
因此:
相对于要求严格的 AVL 树来说,红黑树的旋转次数少,所以对于插入、删除操作较多的情
况下,我们就用红黑树。但是,只是对查找要求较高,那么 AVL 还是较优于红黑树
红黑树与AVL树的区别
红黑树与AVL树都是自平衡的二叉查找树,但它们在维持平衡的方式上有所不同。AVL树通过保持任何节点的两个子树的高度最大差别为一来维持平衡,而红黑树则通过节点的颜色和旋转操作来维持平衡。相比之下,红黑树的旋转次数更少,但查找效率可能略低于AVL树。然而,红黑树在实际应用中通常更加高效,因为它在保持平衡的同时减少了旋转操作的复杂性。

红黑树左旋与右旋的区别

当在对红⿊树进⾏插⼊和删除等操作时,对树做了修改可能会破坏红⿊树的性质。为了继续保持红⿊树的性质,可以通过对结点
进⾏重新着⾊,以及对树进⾏相关的旋转操作,即通过修改树中某些结点的颜⾊及指针结构,来达到对红⿊树进⾏插⼊或删除结点等操作
后继续保持它的性质或平衡的⽬的。
树的旋转分为左旋和右旋,下⾯借助图来介绍⼀下左旋和右旋这两种操作。
在这里插入图片描述

在这里插入图片描述

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

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

相关文章

[C++][opencv]基于opencv实现photoshop算法亮度和对比度调整

【测试环境】 vs2019 opencv4.8.0 【效果演示】 【核心实现代码】 #include <iostream> #include "opencv2/core.hpp" #include "opencv2/imgproc.hpp" #include "opencv2/highgui.hpp"using namespace std; using namespace cv;#defi…

【区块链+食品安全】食药产业全流程可追溯平台 | FISCO BCOS应用案例

为响应国家强化食品安全追溯监管的号召&#xff0c;吉科软信息技术有限公司基于 FISCO BCOS 联盟链开源技术&#xff0c;推出了 食药产业全流程可追溯平台&#xff0c;并应用于吉林省白山市。该平台建立了从食药产品种养殖、生产加工、冷链运输、 流通到消费的全链条可追溯体系…

掌握Python eval()函数:解析动态代码执行的神奇之处

eval() 是 Python 提供的一个内置函数&#xff0c;用于动态执行字符串形式的表达式。 虽然它功能强大&#xff0c;但同时也伴随着一定的风险和局限性。在本文中&#xff0c;我们将详细介绍 eval() 的用法、注意事项以及一些常见的应用场景。 一、eval() 函数的基本用法 基本语…

SpringIOC和SpringAOC

lombok插件 XML<!-- 加载资源文件 --><context:property-placeholder location"classpath:jdbc.properties"></context:property-placeholder><!-- 注入数据源 --><bean id"dataSource" class"com.mchange.v2.c3p0.ComboP…

Supervision 计算机视觉工具

简介 Supervision库是Python计算机视觉低代码工具&#xff0c;旨在为用户提供便捷高效的接口&#xff0c;以便处理数据集并直观地展示检测结果。绘制检测结果&#xff0c;统计指定区域内检测目标数量Supervision都提供了相应的接口 安装库 要求Python版本>3.8 1.安装无图像…

【机器学习】反向传播算法的直观解释、微积分原理以及反向传播中的链式法则

引言 正如有句话说的好&#xff0c;neurons-that-fire-together-wire-together&#xff08;一同激活的神经元关联在一起&#xff09; 文章目录 引言一、反向传播算法的直观解释1.1 前向传播1.2 计算误差1.3 反向传播误差1.4 更新权重 二、微积分原理2.1 损失函数 L L L2.2 链式…

javaEE WebServlet、SpringWebMVC、SpringBoot实现跨域访问的4种方式及优先级

文章目录 1. 前置知识2. 原理和解决方案总结2.1. 跨域不通过原理流程图2.2. 实现原理&#xff1a;添加以下http响应头2.3. 四种跨域实现方式及优先级&#xff08;从高到低&#xff09; 3. 具体实现代码3.1. 跨域全局配置方式-Filter(全适用)3.2. 跨域全局配置方式-SpringMvc3.3…

数字孪生模型制作教程虚拟现实城市模型制作3dmax数字城市glb/gltf

需要做数字孪生可以QQ可以联系这里&#xff0c;谢谢 下面开始教程 1打开3dmax软件&#xff0c;和需要做的建筑图片 2 在3dmax安图片先建一个长方体框架 3先给长方体贴一个墙体贴图 4在ps做贴图 5 做好贴图贴到3dmax中 6 然后ps再做下一张贴图 7 做好贴图贴到3dma…

[Redis] Redisson分布式锁原理及源码分析

目录 基于 Redis 的分布式锁 Redisson实现分布 Redisson分布式锁原理图 RedissonLock实现分布式锁源码分析 RedissonLock构造方法 lock()加锁 获取锁 锁续命逻辑 tryLockInnerAsync加锁lua脚本分析 unlock()解锁 基于 Redis 的分布式锁 实现方式: 使用 Redis 的 SE…

Idea2023.3版本创建spring Initializr没有JDK8

解决方法&#xff1a; https://start.aliyun.com

SOMEIP_ETS_037:echoUINT8RELIABLE_client_closes_TCP_connection_automatically

测试目的&#xff1a; 验证当所有服务停止时&#xff0c;DUT不会关闭TCP连接。 描述 本测试用例旨在检验DUT在停止所有服务时&#xff0c;是否能够保持TCP连接的活跃状态&#xff0c;而不发送FIN,ACK以关闭连接。 测试拓扑&#xff1a; 具体步骤&#xff1a; TESTER&#…

STM32学习笔记3 ---中断,定时器

目录 EXTI外部中断 NVIC嵌套中断向量控制器 EXTI外部中断 AFIO 旋转编码器 定时器TIM TIM定时中断 ​编辑​编辑 ​编辑 TIM输出比较&#xff08;OC&#xff09; 引脚重映射 舵机 直流电机 TIM输入捕获&#xff08;IC&#xff09; ​编辑 TIM编码器接口 附&#…

漏洞挖掘 | 某系统webpack接口泄露引发的一系列漏洞

信息搜集 这里找到从小穿一条裤子长大的兄弟&#xff0c;要挟他交出来他的统一账号&#xff0c;否则把小时候的照片挂网上&#xff0c;开始某大学的资产搜集&#xff0c;直接hunter搜索此大学域名 看有价值的站点&#xff0c;ok找到下面的站点 未授权敏感信息泄露越权任意用…

力扣高频SQL 50题(基础版)第四十二题之1517.查找拥有有效邮箱的用户

文章目录 力扣高频SQL 50题&#xff08;基础版&#xff09;第四十二题1517.查找拥有有效邮箱的用户题目说明实现过程准备数据实现方式结果截图总结 力扣高频SQL 50题&#xff08;基础版&#xff09;第四十二题 1517.查找拥有有效邮箱的用户 题目说明 表: Users -----------…

Dify on WeChat

Dify on WeChat 本项目为 chatgpt-on-wechat下游分支 额外对接了LLMOps平台 Dify&#xff0c;支持Dify智能助手模型&#xff0c;调用工具和知识库&#xff0c;支持Dify工作流。 Dify接入微信生态的详细教程请查看文章 手摸手教你把 Dify 接入微信生态 如果我的项目对您有帮助…

gin获得get和post请求参数,获得请求头信息

获得头信息 router.GET("/", func(c *gin.Context) {name : c.Query("id")fmt.Println(name)Token : c.GetHeader("Token")c.JSON(http.StatusOK, Token)})获得get和post信息 package mainimport ("fmt""github.com/SimonWang00…

Leetcode面试经典150题-236.二叉树的最低公共祖先

解法都在代码里&#xff0c;不懂就留言或者私信 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode(int x) { val x; }* }*/ class Solution {/**题目分析&#xff1a;本题是经典的二…

仓颉语言运行时轻量化实践

杨勇勇 华为语言虚拟机实验室架构师&#xff0c;目前负责仓颉语言静态后端的开发工作 仓颉语言运行时轻量化实践 仓颉Native后端&#xff08;CJNative&#xff09;是仓颉语言的高性能、轻量化实现。这里的“轻量化”意指仓颉程序运行过程中占用系统资源&#xff08;内存、CPU等…

数据分析:品牌营销如何借势小红书搜索流量

导语 近期&#xff0c;小红书推出《10大搜索趋势洞察》&#xff0c;在找答案这件事上&#xff0c;你永远可以相信小红书。 据悉&#xff0c;70%的小红狐月活用户使用搜索功能&#xff0c;用户平均每天搜索6次&#xff0c;三分之一的用户打开小红书的第一件事就是搜索&#xf…

haproxy知识点整理

haproxy知识点整理 haproxy七层代理负载均衡什么是负载均衡为什么使用负载均衡 负载均衡类型四层负载均衡七层负载均衡四层和七层的区别 环境搭建:客户端(client)haproxy服务器两台服务器hapserver1hapserver2 简单的haproxy负载均衡 haproxy的基本配置信息global配置proxies配…