真正理解红黑树,真正的

个人关于红黑树的理解 目录   红黑树(red-black-tree) 一.红黑树的定义和性质 二.红黑树的结构 三.输出一颗红黑树 四.查询红黑树 查找 查找最大关键字元素和最小关键字元素 查找前驱和后继 五.※插入和删除 插入 删除 六.完整代码 红黑树(red-black-tree) 一.红黑树的定义和性质 红黑树是一种二叉查找树,在每个结点上增加一个存储位表示结点的颜色,,可以是... 阅读详情

作为一种数据结构,红黑树可谓不算朴素,因为各种宣传让它过于神秘,网上搜罗了一大堆的关于红黑树的文章,不外乎千篇一律,介绍概念,分析性能,贴上代码,然后给上罪恶的一句话,它最坏情况怎么怎么地...
      
       我们想,一棵二叉树怎么就是最坏情况,那就是它退化为一个链表,这样查找就成了遍历。问题是,平衡二叉树怎么会退回链表!它是怎么保持平衡的?能不能简单地阐述?当然可以!一般的讲述红黑树的资料都是直接给出黑节点相同,红节点不连续等来作为一个足够硬但是又不是太硬的约束来保证树的平衡,但事实上,它还有更加简单的理解方式。

1.查找-在高度不在宽度
对于查找而言,如果一棵二叉树的高度是N,那么最多可以在N步内完成查找,这个不用解释,解释这个有点喧宾夺主了。这就是说,树的高度要尽可能矮。考虑到查找的平均情况,叶子节点到根节点的距离不能差别太大。

2.二叉树的不平衡根源
一棵树在查找看来变得不平衡是因为子树的高度相差很大。
       二叉树为什么会这么容易变得不平衡,很简单,因为它只有二叉,左右均有50%的概率,那么插入N个节点全部都是左节点或者右节点的概率就是50%的N次方,如果是8叉树,那么这个概率就是12.5%的N次方,哪个概率大,自己算。

3.多叉树-宽度换高度
在第1节以及第2节,我们已经知道,树的宽度越大,高度越小,这样查询起来越快,Cisco路由器里不是有256叉乃至1024叉树吗?但是这样真的很好吗?对于稀疏节点,这样会严重消耗内存。
       如果我们考虑CPU的MMU系统,就会知道,二级页表和三级页表的区别就在于对付稀疏地址空间的效果不同。

4.权衡-2,3树
我们发现,道生一,一生二,二叉树是一个完美的开始,但是我们发现它特别容易倾斜,倾斜的时候别触摸。我们也不能一下子就上256叉树,即使那样在海量节点情况下也抗不住,因此这种盲目宽度换高度的方案没有可扩展性。我们需要找出一种动态的机制,让一棵树动态调整保持平衡。
       为了更加容易找出这个机制,让它更加容易现形,暂时不断增加树的宽度,如果增加到3叉树还找不到方案,就增加到4叉树...我们说的N叉树并不是说一个节点一定有N个子节点,而是说它最多有N个子节点。
       迄今为止,以前都是我自己形而上的观点,几年前我的想法就到此为止,原因在于那段时间特别郁闷,就想找出些技术上的形而上思想,可是突然自己变好了,就没有继续下去。幸运的是,我现在发现确实有这么一个方案,而红黑树就是从3叉树回退过去的。
       让我高兴的是,我的思路并没有跑偏。
5.2-3树的平衡变换
如果是二叉树,那么你插入一个节点,你只有最多1次机会保持子树的高度不变,如果是一个三叉树,那么就有2次机会。现在开始,我们为二叉树添了一叉,变成了三叉树。

       二叉树的时候,一个节点有两个分支,三叉树的时候,有三个分支。一个点可以将区间分为两个部分区域,要想将一个区间分为三个部分区域,就需要两个点,因此三叉的情形下,节点存储的是两个点而不是一个,如下图所示:

现在考虑插入一个新节点,这个2-3树怎么保持平衡。非常简单,我们知道,插入的位置一定是叶子,假设当前的树是平衡的,现在分两种情况:
1).插入的新叶子节点的父节点是一个二叉节点
这种情况最简单,二叉节点变三叉节点即可,如下图所示:

2).插入的新叶子节点的父节点是一个三叉节点
这种情况比较复杂。树总是要长高的,保持平衡的方式就是同时长高,而这是不可能的,插入一个节点只能让该节点所在的子树长高。然而,如果能将这个信息上升到根部,在根部长高,就实现了“同时长高”!
       还是循着上面的那个思路,我们继续增加树叉的数量,我们把它增加到4!新节点的插入如下图所示:

很遗憾,没有完成任务,但是最终我们提出了两个问题,只要解决了这两个问题,所有问题就解决了。
       解决这两个问题,无疑都要牵扯到节点P的父节点以及再往上的节点,有两种可能:
可能性1:P的父节点PP是一个二叉节点
这个太爽,我们直接把P以及它的子树全部提到PP节点即可,类似B插入的情景,如下图所示:

问题2解决。
可能性2:P的父节点PP是一个三叉节点
这就有点不好办了,不过有最后一击!不管怎样先把P节点以及其子节点全部上提到PP,保持最底部的平衡性,这样就可以递归解决了,此时我们又一次遇到了往一个三叉节点里面插入子节点的问题了,为了不增加树高,唯一的方式就是膨胀成一个四叉节点-宽度换高度。如下图所示:

最后,我们发现,在递归的过程中,要么碰到了P..P是个二叉节点,此时按照问题2的解决方式将当前节点的值直接提到P...P中,其子树降低一个高度,抵消增加的高度,平衡保持,递归结束,要么递归到了根节点,此时只需要一个分裂操作即可完美结束!


6.演进到红黑树
很显然,通过上面的描述,我们似乎找到了一个使树保持平衡的方案,而且是相当完美的平衡!核心就是宽度和高度之间的博弈。我们总是可以用一个宽度抵消一层高度,整个过程就是一次或者多次的一加一减,最终的结果还是0!
       然而,这也不再是二叉树了,有的节点变成了三叉,并且保存了两个值,该两个值将区间分割成了三部分,是为三叉!因此在使用上就不如二叉树方便,比较操作复杂化了。事实上,将三叉节点处理成二叉节点,这棵树就成了红黑树!怎么处理呢?很简单!如下图所示:

看到了吧,红色节点就是从2-3树中分出来的,为了维持一棵二叉树而不是2-3树,必须将三叉节点变成二叉节点,这是一个宽度换高度得回退,即高度换宽度,当然代价就是不再完美平衡。
       按照以上的这个变换,你自己试试看,可以变出两个连续的红节点吗?NO!还在纠结红黑树的性质概念吗?看了它的演进,你会发现,很多红黑树的复杂概念和让人没有头绪的性能都是自然而然的。下面我们来看一下它的最坏情况是什么。
       还是以2-3树分析,如果在一棵2-3树中,最左边路径上的节点全部是三叉节点,而最右边路径上的节点都是二叉节点,那么把它变换成二叉红黑树之后,就会发现最左边的路径上是红黑间隔的节点,而最右边的路径上全部是黑节点,它们的高度差接近2倍。出现这样的情况是令人悲哀的,但是也是极低概率的。
       红黑树的所有包括旋转等操作,都可以映射到2-3树中,而我们对2-3树以及高度和宽度之间的博弈已经足够理解了。请再次去理解红黑树吧,再看看它的性质和概念,together with左旋和右旋,是不是有一种新的体会呢?
---------------------  
作者:dog250  
来源:优快云  
原文:https://blog.youkuaiyun.com/dog250/article/details/46665743  
版权声明:本文为博主原创文章,转载请附上博文链接!

了解红黑树的起源,理解红黑树的本质 前言 本文收录于专辑:http://dwz.win/HjK,点击解锁更多数据结构与算法的知识。 你好,我是彤哥。 前面两节,我们一起学习了关于跳表的理论知识,并手写了两种完全不同的实现,我们放一张图来简单地回顾一下: 实现跳表的关键之处是在有序链表的基础上加上各层索引,通过这些索引可以做到O(log n)的时间复杂度快速地插入、删除、查找元素。 说起跳表,我们就不得不提另一种非常经典的数据结构——红黑树,红黑树相对于跳表来说,虽然时间复杂度都是O(log n),但是红黑树的使用场景相对更广泛一些,在早 阅读详情

相关推荐

宏基因组功能注释实战:从CAZyme到VFDB的完整流程(含数据库下载与脚本优化)

本文详细介绍了宏基因组功能注释的完整流程,涵盖CAZyme、eggNOG、CARD和VFDB四大核心数据库的实战应用。从环境配置、数据库下载与预处理到注释流程执行与优化,提供了全面的操作指南和脚本优化建议,帮助研究人员高效完成宏基因组数据分析。特别针对CAZyme注释等关键步骤给出了参数优化方案和常见问题排查方法。

weixin_29289821的博客 295

真正理解红黑树,真正的(Linux内核里大量用到的数据结构,且常被二货问到)

作为一种数据结构,红黑树可谓不算朴素,因为各种宣传让它过于神秘,网上搜罗了一大堆的关于红黑树的文章,不外乎千篇一律,介绍概念,分析性能,贴上代码,然后给上罪恶的一句话,它最坏情况怎么怎么地...              我们想,一棵二叉树怎么就是最坏情况,那就是它退化为一个链表,这样查找就成了遍历。问题是,平衡二叉树怎么会退回链表!它是怎么保持平衡的?能不能简单地阐述?当然可以!一般的讲述红黑树

TCP/IP 1万+

手把手教你用ZLMediaKit搭建WebRTC直播:本地推流与播放实战

本文详细介绍了如何使用ZLMediaKit搭建WebRTC直播系统,涵盖从环境准备、编译部署、SSL证书配置到本地推流与播放的完整实战流程。通过一步步的指导,帮助开发者快速掌握基于ZLMediaKit的WebRTC推拉流技术,构建低延迟的实时音视频应用。

weixin_28842367的博客 347

Linux学习笔记——数据结构

学习笔记

GG61685493的博客 798

触摸屏蓝牙控制

使用杰理芯片通过蓝牙实现触摸屏功能,需要结合触摸屏数据采集、蓝牙数据传输以及移动端应用的实现。

m0_46145044的博客 1109

采用超级电容设计的UPS不间断电源,用于掉电数据保存,可续航10-60秒

关键词:树莓派 CM4 UPS 不间断电源 掉电保存 超级电容 SuperCap 充电 升压 续航 10F 法拉电容 Mcuzone 野芯科技 概述:我们经常会遇到系统意外掉电的情况,对于一些可靠性要求很高的工业现场设备或者运行过程中有重要数据需要保存的平台就需要UPS电源了。常规的UPS采用后备锂电池设计,具备无缝切换、续航时间长、稳定可靠等特点,但同时也有价格过高、体积过大的缺点。对于不少仅需在检测到系统掉电后对数据进行保存即可的应用而言,这些标准的UPS电源就不太合适,为此我...

6603

Linux 学习记录19(数据结构篇)

节点定义 typedef struct node {char data;//数据 struct node * left;//左分支 struct node * right;//右分支 } btree;

qq_59004923的博客 241

【STM32学习】(29)STM32实现595驱动三个数码管(标准库和HAL库实现)

我选用的单片机型号为:STM32F103系列 74LS595是一个串转并行输出的芯片,它能为单片机节省很多的IO口,应用场景广泛。 现要求三个数码管动态显示,常规设计都是并行实现,需要8个IO数据口,然后还需要3个IO片选数码管接口,这样大大占用了IO口,导致连接的外设变少。因此我们引入74LS595芯片。电路设计如下: 只需要三个共阴极数码管与三个595芯片级联即可完成,通过RCLK,SCK,SER三个IO即可完成对数码管的动态控制并显示。电路焊接的实物图如下: 要求完成功能:实现数.

XiaoCaiDaYong的博客 8264

Linux内核入门:内核中常用的数据结构和算法

/红黑树节点//左孩子//右孩子//父节点颜色以及其他信息//...// 红黑树根节点}rb_root;int key;int data;}mytype;//根节点rb_subtree_last:指向当前节点的右子树的最后一个节点rb_left:指向当前节点的左子结点rb_right:指向当前节点的右子节点rb_parent_color:保存父节点的地址和颜色信息.其中,最低位表示节点颜色(RB_RED/RB_BLACK)

qq_52267946的博客 1614

Dify社区版多工作空间功能解锁:源码修改与多租户架构解析

多租户架构是现代SaaS平台实现数据隔离与资源管理的核心技术,其核心原理是通过租户模型将用户、应用和数据在逻辑上隔离。在AI应用开发平台中,这种架构能有效支持多团队、多项目并行开发,确保不同业务线的数据安全与独立迭代。Dify作为开源AI应用构建平台,其底层已设计完善的多租户模型,但社区版默认限制了单用户单工作空间。本文通过精准修改两处关键代码——账户初始化逻辑与系统功能开关,释放了平台固有的多工作空间管理能力。该方案无需改动数据库结构,直接利用现有RBAC权限体系,实现了类似企业版的**多租户隔离**体验

weixin_27059669的博客 1058

OpenClaw实战一|企业微信AI客服数字员工:自动应答+工单创建+数据统计,零代码3天落地

OpenClaw做企业微信AI客服数字员工,真正的价值不是“能自动回复”,而是把“咨询-应答-工单-统计-复盘”全流程闭环。对中小企业来说,不用招专职AI开发、不用买昂贵客服系统,一台服务器、零代码配置,就能拥有媲美大厂的智能客服能力。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 515

数据结构:栈「详解」

栈(Stack)是一种常见的数据结构,它是一种“后进先出”(Last In First Out,LIFO)的数据结构。栈可以看做是一种特殊的线性表,只能在栈顶进行插入和删除操作。栈顶是允许操作的,而栈底是固定的。

weixin_56433857的博客 1万+

广义正态分布优化算法(GNDO)详解:从理论到实践

广义正态分布优化算法(GNDO)是一种基于正态分布理论的新型元启发式优化算法。该算法通过局部开发和全局探索两种策略平衡搜索过程:局部开发利用广义平均位置和标准差进行精细搜索,而全局探索通过随机个体信息共享扩大搜索范围。GNDO具有参数少、结构简单、收敛速度快等优点,在光伏模型参数提取等工程优化问题中表现优异。算法将种群位置更新与正态分布参数调整相联系,通过自适应机制平衡探索与开发,数学分析表明其具有全局收敛性。相比传统优化算法,GNDO在探索能力和开发能力上均有优势,是高维复杂优化问题的有效解决方案。

qq_42212808的博客 138

红黑树的理解

写在前面 当在10亿数据进行不到30次比较就能查找到目标时,不禁感叹编程之魅力!人类之伟大呀! —— 学红黑树有感。 终于,在学习了几天的红黑树相关的知识后,我想把我所学所想和所感分享给大家。红黑树是一种比较难的数据结构,要完全搞懂非常耗时耗力,红黑树怎么自平衡?什么时候需要左旋或右旋?插入和删除破坏了树的平衡后怎么处理?等等一连串的问题在学习前困扰着我。如果你在学习过程中也会存在我的疑问,那么本文对你会有帮助,本文帮助你全面、彻底地理解红黑树! 本文将通过图文的方式讲解红黑树的知识点,并且不会涉及到任何代

qq_44918331的博客 324

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

红黑树理解以及Java实现

我对红黑树的理解 红黑树本身并不复杂,只是在插入删除的时候情况比较多,如果强行记忆的话会显得比较困难,而且容易忘记。所以以前对红黑树一直没有很好的掌握。恰好这次借着复习数据结构的机会,静下心来仔细的学习了一下红黑树,所以用这篇文章把我对红黑树的操作的理解记录下来,在理解的基础上记忆会容易得多,这样以后就不用重复学习啦! 1. 红黑树的定义 红黑树是一颗二叉查找树,且具有如下...

qq_41854763的博客 1万+

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

红黑树的删除_从红黑树的本质出发,彻底理解红黑树!

前言早上好,我是彤哥。上一节,我们一起从二叉树、二叉查找树、平衡树、AVL树、2-3树、2-3-4树、B树,一路讲到红黑树,最后得出红黑树的本质:红黑树就是2-3-4树,请看下图:我们知道2-3-4的插入、删除、查找元素的原理是相当简单的,那么,我们是不是可以利用2-3-4树来记忆红黑树呢?答案是肯定的,本节,我们就来看看如何利用2-3-4树来快速掌握红黑树,再也不用死记硬背了~~好了,让我们进入...

weixin_39634508的博客 102

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

30张图带你彻底理解红黑树/教你初步了解红黑树

两边很详细的红黑树教程博客: 30张图带你彻底理解红黑树 教你初步了解红黑树

闻赤松之清尘,愿承风乎遗则的博客 395

理解红黑树

<br />关于红黑树,这个名字的来历就说多说了,是Guibas和Sedgewick也算是看了好多遍,但没有一次真正理解过,也没有去实现它。<br /> <br />红黑树满足二叉查找树的所有性质,不同的是它近似平衡,所有的操作都可以在O(lg(n))内完成,所以效率比较高,先列出红黑树的5条性质:<br />1、每个结点或者是红的,或者是黑的<br />2、根结点是黑的<br />3、每个叶子结点是黑的(这里的叶结点是外部结点,貌似只在统计黑结点个数的时候用)<br />4、如果一个结点是红的,那么它的两

387

理解红黑树插入与删除

综述 红黑树是一个自平衡的二叉查找树,在插入和删除等可能破坏树的平衡时需要自动调整平衡,红黑树的定义就是红黑树是一种含有红黑结点并能自平衡的二叉查找树。 红黑树的性质 ①、每个节点要么是红色的要么是黑色的; ②、根节点是黑色的; ③、每个叶子节点(NIL)都是黑色的; ④、每个红色节点的两个子节点一定都是黑色的; ⑤、任意一节点到每个叶子节点的路径都包含相同数量的黑色节点 从性质⑤可推出结论:如果一个节点存在黑色的子节点,那么这个节点肯定有两个子节点。 关于左旋和右旋问题,以下面两张图为例进行理解:

qq_43060759的博客 493

红黑树的删除_从红黑树的本质出发,彻底理解红黑树

前言早上好,我是彤哥。上一节,我们一起从二叉树、二叉查找树、平衡树、AVL树、2-3树、2-3-4树、B树,一路讲到红黑树,最后得出红黑树的本质:红黑树就是2-3-4树,请看下图:我们知道2-3-4的插入、删除、查找元素的原理是相当简单的,那么,我们是不是可以利用2-3-4树来记忆红黑树呢?答案是肯定的,本节,我们就来看看如何利用2-3-4树来快速掌握红黑树,再也不用死记硬背了~~好了,让我们进入...

weixin_39967120的博客 99

我所理解的红黑树删除

看这篇文章 需要了解AVL树,知道AVL树的 删除,旋转调整等操作。这是我对红黑树删除的一些理解

董伟 587

对于红黑树的深入理解

对于红黑树的深入理解从五条性质谈起二三树通过二三树重新理解红黑树的性质 从五条性质谈起 说起红黑树的性质,一般引用《算法导论》中对红黑树的五条性质定义 每个节点或者是黑色,或者是红色。 根节点是黑色。 每个叶子节点(NIL)是黑色。 如果一个节点是红色的,则它的子节点必须是黑色的。 从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。 初次接触这五条性质时,一头雾水,虽然背下来不难,...

lc199408的博客 545

红黑树的理解与 Java 实现

来源:xyk_1021blog.youkuaiyun.com/weixin_42786274/article/details/86557922前言红黑树的性质红黑树的操作1. 查找操作2. 插入操作3...

互扯程序的博客 172
上一篇: Linux内核软RPS实现网络接收软中断的负载均衡分发
下一篇: Linux内核的netpoll框架与netconsole
废言Pro
博客等级 码龄16年 1093粉丝 142原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值