数据结构与算法:红黑树讲解

关于红黑树, 这篇讲的更详细易懂。

https://www.cnblogs.com/jakelin/p/14324966.html

一颗平衡的二叉搜索树的任意节点平均查找效率为树的高度h,即O(lgn)

但是如果二叉搜索树的失去平衡(元素全在一侧),搜索效率就退化为O(n),因此二叉搜索树的平衡是搜索效率的关键所在。

    为了维护树的平衡性,数据结构内出现了各种各样的树,比如AVL树通过维持任何节点的左右子树的高度差不大于1保持树的平衡,而红黑树使用颜色的概念维持树的平衡,使二叉搜索树的左右子树的高度差保持在固定的范围。

     相比于其他二叉搜索树树,红黑树对二叉搜索树的平衡性维持有着自身的优势。

    红黑树是一种自平衡二叉搜索树,它通过对节点进行着色(红色或黑色)并在树的操作过程中维护一系列性质,以确保树大致保持平衡。这种平衡确保了树的搜索、插入和删除操作的最坏情况时间复杂度为O(log n),其中n是树中元素的数量。

红黑树的定义

1.节点非红即黑。

2.根节点是黑色。

3.所有NULL结点称为叶子节点,且认为颜色为黑。

4.所有红节点的子节点都为黑色。

5.从任一节点到其叶子节点的所有路径上都包含相同数目的黑节点。

红黑树数据结构

template<class T>class rb_tree_node{    typedef  rb_tree_node_color  node_color;    typedef  rb_tree_node<T>  node_type;public:    
node_color color;//颜色    
node_type* parent;//父节点    
node_type* left;//左子节点    
node_type* right;//右子节点    
T value;//值    
....
};

红黑树插入节点

特殊情况考虑完成之后,下面假设又开始添加节点,我们面对的第一个问题是新增加的节点是标记成红色还是黑色?显然无论是新插入的节点是黑色或者是红色,红黑树限制1,2,3一定是满足的,那么如果将新插入的节点标识成黑色的话,可能违反5,但是如果将新插入的节点标识成红色,肯能违反4,看似好像是两个是类似的。

情况 1.  如果插入的节点是根节点(初始的红黑树为空)

直接将该节点颜色改成黑色。

情况 2.  插入结点的Key已经存在

直接更换节点的值。

情况 3.  插入的节点的父节点是黑色

插入的节点不是红黑树的根节点,如果新插入的节点的父节点是黑色的话,红黑树不需要调整,直接插入。

情况 4. 插入节点的父节点是红色

根结点是黑色。如果插入的父结点为红结点,那么该父结点不可能为根结点,所以插入结点总是存在祖父结点。

情况4.1  插入节点的父节点是红色,叔叔节点是黑色

4.1.1 父节点和祖父节点在一条线上。

需要旋转(左旋/右旋)后变色

4.1.2 父节点和祖父节点不在一条线上。

首先调换位置,然后旋转(左旋/右旋)后变色。

情况4.2 父节点是红色,叔叔节点是红色

首先,交换祖父节点和叔叔节点的颜色。

如果通过这样做使得祖父节点成为了双重红色(祖父节点的父节点也是红色)

则需要对祖父节点进行进一步的操作,可能是旋转或者继续向上层进行重新着色和调整(进行递归的操作)。

红黑树删除节点

红黑树删除节点需要考虑节点的位置,删除节点后需要保持红黑树的平衡性。

二叉树删除结点找替代结点有3种情景:

情景1:若删除结点无子结点

直接删除。

情景2:若删除结点只有一个子结点

用子结点替换删除结点。

情景3:若删除结点有两个子结点

用后继节点(大于删除结点的最小节点)替换删除结点。

当然用前绩节点也可以,不过通常我们会用后继节点。

(把二叉树所有结点投射在X轴上,所有结点都是从左到右排好序的,所有目标结点的前后结点就是对应的前继和后继结点)

如果待删除节点有两个子节点,则不能将该节点直接删除,而是从其右子树中选取最小值节点(或左子树的最大值节点)作为删除节点。

三种情况 和二叉搜索树的节点删除完全相同。

一个重要的思路:删除结点被替代后,在不考虑结点的键值的情况下,对于树来说,可以认为删除的是替代结点。

基于此,上面所说的3种二叉树的删除情景可以相互转换并且最终都是转换为情景1。

情景2:删除结点用其唯一的子结点替换,子结点替换为删除结点后,可以认为删除的是子结点,若子结点又有两个子结点,那么相当于转换为情景3,一直转换,总是能转换为情景1。
情景3:删除结点用后继结点(后继结点肯定不存在左结点),如果后继结点有右子结点,那么相当于转换为情景2,否则转为为情景1。

渐近边界的证明

红黑树的查找效率与二叉搜索树的查找效率相同,即在最坏的情况下时间复杂度为O(log n),其中n是树中节点的数量。

这是因为红黑树保持了树的平衡性,即从根节点到最远的叶子节点的最长路径不会超过最短路径的两倍。这意味着树的高度大致保持在log n的数量级,因此查找效率很高。

为什么STL map和set使用红黑树而不是平衡二叉树?

红黑树提供的平衡程度与性能之间的折中。与平衡二叉树(特别是AVL树)相比,红黑树在维持平衡的严格性上做了妥协。

(1)红黑树是一种自平衡二叉搜索树,它通过对节点进行着色(红色或黑色)并在树的操作过程中维护一系列性质,以确保树大致保持平衡。这种平衡确保了树的搜索、插入和删除操作的最坏情况时间复杂度为O(log n),其中n是树中元素的数量。

(2)AVL树是高度平衡的二叉搜索树,对平衡的要求更严格,任何时候任何节点的两个子树的高度差最多为1。

    这种高度的平衡确保了极佳的查找性能,但是在插入和删除操作时可能需要更频繁的旋转来维持这种严格的平衡,导致这些操作相对于红黑树来说更加耗时。它不像AVL树那样对平衡有严格的要求,因此在插入和删除操作时通常需要较少的旋转,这可以在实际应用中提供更好的性能。在频繁的插入和删除操作时,红黑树较少的旋转次数意味着整体的性能往往更优。


 

参考:

https://zh.wikipedia.org/wiki/%E7%BA%A2%E9%BB%91%E6%A0%91

https://www.cnblogs.com/fornever/archive/2011/12/02/2270692.html

https://www.cnblogs.com/fanzhidongyzby/p/3187912.html

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

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

相关文章

【变压器故障诊断分类及预测】基于GRNN神经网络

课题名称&#xff1a;基于GRNN神经网络的变压器故障诊断分类及预测 版本日期&#xff1a;2024-02-10 运行方式&#xff1a;直接运行GRNN0507.m文件 代码获取方式&#xff1a;私信博主或QQ&#xff1a;491052175 模型描述&#xff1a; 对变压器油中溶解气体进行分析是变压器…

JavaScript 进阶02

深入对象 构造函数 构造函数是用于创建对象的函数。 <script> //构造函数 构造函数的首字母大写 function Obj(name,age,aaa){this.namenamethis.ageage } //调用函数 const obj1new Obj("小明",4) console.log(obj1) </script> 使用 new 关键字调用…

[AutoSar]BSW_Com03 DBC详解 (一)

目录 关键词平台说明一、DBC 定义1.1 相关工具 二、主要组成部分介绍2.1 Networks2.2 ECUs2.3 Network nodes2.4 messages2.5 signal2.6 Value Tables 三、主要组成部分关系图 关键词 嵌入式、C语言、autosar、OS、BSW 平台说明 项目ValueOSautosar OSautosar厂商vector &am…

docker-compose 搭建laravel环境

laravel环境包含nginx,mysql,php7.4,redis 一、安装好docker后pull镜像 1.nginx镜像 docker pull nginx:latest单独启动容器 docker run --name nginx -p 80:80 -d nginx 2.php镜像 docker pull php:7.4-fpm3.mysql镜像 docker pull mysql:5.74.redis镜像 docker pull r…

ChatGPT调教指南 | 咒语指南 | Prompts提示词教程(三)

在人工智能成为我们日常互动中无处不在的一部分的时代&#xff0c;与大型语言模型(llm)有效沟通的能力是无价的。“良好提示的26条原则”为优化与这些复杂系统的交互提供了全面的指导。本指南证明了人类和人工智能之间的微妙关系&#xff0c;强调清晰、专一和结构化的沟通方法。…

【数据结构初阶 8】二叉树练习题

文章目录 &#x1f308; 01. 求二叉树结点个数&#x1f308; 02. 求二叉树叶结点个数&#x1f308; 03. 求二叉树的高度&#x1f308; 04. 求第 k 层结点个数&#x1f308; 05. 查找值为 x 的结点&#x1f308; 06. 判断是否是单值二叉树&#x1f308; 07. 判断两棵树是否相同&…

单片机05__串口USART通信__按键控制向上位机传输字符串

串口USART通信 通用UART介绍 1.通信的概念 计算机与外界进行信息交换的过程称之为通信。 在通信的过程中&#xff0c;通信双方都需要遵守的规则称之为通信协议。 硬件协议&#xff1a;将数据以什么样的方式传输过去 软件协议&#xff1a;将数据以什么样的顺序传输过去 2.常用…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 2月26日,星期一

每天一分钟&#xff0c;知晓天下事&#xff01; 2024年2月26日 星期一 农历正月十七 1、 气象台&#xff1a;3月初之前南方大部将维持阴雨雪天气。 2、 据海关统计&#xff0c;京津冀协同发展十年成效显著&#xff0c;外贸总量跨两个万亿台阶。 3、 2024年研考初试成绩今天起…

逆向茶话会笔记

安卓逆向 用用burp设置代理或者用charles抓包 windows httpopen 类比web站点渗透测试 推荐书 飞虫 安卓大佬不怎么打ctf 喜欢在看雪和吾爱破解 提问环节 q websocket grpc抓包有什么推荐的工具&#xff1f; a 不太了解 游戏安全和llvm 既要逆游戏也要逆外挂 逆游戏入…

自己测试CSDN质量分3

你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好 质量分测试网址

【Leetcode】938. 二叉搜索树的范围和

文章目录 题目思路代码结论 题目 题目链接 给定二叉搜索树的根结点 root&#xff0c;返回值位于范围 [low, high] 之间的所有结点的值的和。 示例 1&#xff1a; 输入&#xff1a;root [10,5,15,3,7,null,18], low 7, high 15 输出&#xff1a;32 示例 2&#xff1a; 输入…

【VSCode】解决VSCode远程连接问题:远程主机可能不符合 glibc 和 libstdc++

今天用VSCode进行ssh连接时&#xff0c;提示“远程主机可能不符合 glibc 和 libstdc VSCode 服务器的先决条件”。查了一下发现这个问题主要是由于VSCode在一月份发布的最新版本v1.86中要求远程主机 glibc>2.28导致的&#xff0c;所以ssh连接Ubuntu 18.04的时候就会提示这个…

apachectl: line 79: 20233 Segmentation fault (core dumped) $HTTPD “$@“

[TOC](apachectl: line 79: 20233 Segmentation fault (core dumped) $HTTPD “$”) 1、问题描述 apache 启动报错 apachectl: line 79: 20233 Segmentation fault (core dumped) $HTTPD “$” 2、问题分析 参考链接: https://stackoverflow.com/questions/43726930/apache…

【JVM】线上一次fullGC排查思路

fullGC问题背景 监控告警发现&#xff0c;今天开始我们线上应用频繁出现fullGC&#xff0c;并且每次出现后磁盘都会被占满 查看监控 查看监控发现FULLGC的机器均为同一个机房的集器&#xff0c;并且该机房有线上error报错&#xff0c;数据库监控对应的时间点也有异常&#x…

sonar-java 手写一个规则-单元测试分析

前言 最近做项目&#xff0c;定制sonar规则&#xff0c;提高Java代码质量&#xff0c;在编写的sonar规则&#xff0c;做验证时&#xff0c;使用单元测试有一些简单的心得感悟&#xff0c;分享出来。 自定义规则模式 sonar的自定义规则很简单&#xff0c;一般而言有2种模式可…

JAVA工程师面试专题-《Mysql》篇

目录 一、基础 1、mysql可以使用多少列创建索引&#xff1f; 2、mysql常用的存储引擎有哪些 3、MySQL 存储引擎&#xff0c;两者区别 4、mysql默认的隔离级别 5、数据库三范式 6、drop、delete 与 truncate 区别&#xff1f; 7、IN与EXISTS的区别 二、索引 1、索引及索…

数据库应用:Windows 部署 MySQL 8.0.36

目录 一、实验 1.环境 2.Windows 部署 MySQL 8.0.36 3.Windows配置环境变量 4.Navicat链接MySQL 二、问题 1.安装MySQL 报错 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 主机软件版本IP备注WindowsMySQL8.0.36localhost 2.Windows 部署 MySQL 8.0.…

云原生之容器编排实践-ruoyi-cloud项目部署到K8S:MySQL8

背景 前面搭建好了 Kubernetes 集群与私有镜像仓库&#xff0c;终于要进入服务编排的实践环节了。本系列拿 ruoyi-cloud 项目进行练手&#xff0c;按照 MySQL &#xff0c; Nacos &#xff0c; Redis &#xff0c; Nginx &#xff0c; Gateway &#xff0c; Auth &#xff0c;…

顺序表知识点——顺序表的增删查改

目录 准备文件 创建顺序表蓝图 顺序表初始化函数接口 顺序表的销毁函数接口 顺序表的打印函数接口 顺序表的插入函数接口 顺序表的删除函数接口 从本节开始&#xff0c; 复习数据结构。 空间复杂度还有时间复杂度之后利用例题学习。 这节先学习顺序表的增删查改。 首…

Android Gradle开发与应用 (二) : Groovy基础语法

1. Groovy是什么 Groovy是基于JVM虚拟机的一种动态语言&#xff0c;语法和Java非常相似&#xff0c;并能够无缝地与Java代码集成和互操作&#xff0c;增加了很多动态类型和灵活的特性。(闭包、DSL) 语法和Java非常相似这个特点&#xff0c;意味着&#xff0c;如果我们完全不懂…