【红黑树】二叉树的改进---红黑树|平衡二叉树和红黑树的区别

article/2025/9/21 0:25:48

目录

二叉树的改进---红黑树

红黑树和AVL树(平衡二叉树)区别


 

确实是AVL(平衡二叉树)更严格(左右子树树高不超过1), 红黑树只保证最长路径不超过最短路径的2倍

 

二叉树的改进---红黑树

这个是一个 小灰程序员 的作品,可以关注他的公众号。

 

……省略多图……

 

640?wx_fmt=jpeg

 

二叉查找树(BST)具备什么特性呢?

 

1.左子树上所有结点的值均小于或等于它的根结点的值。

2.右子树上所有结点的值均大于或等于它的根结点的值。

3.左、右子树也分别为二叉排序树。

 

下图中这棵树,就是一颗典型的二叉查找树:

 

640?wx_fmt=jpeg

 

1.查看根节点9:

 

640?wx_fmt=jpeg

 

2.由于10 > 9,因此查看右孩子13:

 

640?wx_fmt=jpeg

 

3.由于10 < 13,因此查看左孩子11:

 

640?wx_fmt=jpeg

 

4.由于10 < 11,因此查看左孩子10,发现10正是要查找的节点:

 

640?wx_fmt=jpeg

 

640?wx_fmt=jpeg

 

640?wx_fmt=jpeg

 

640?wx_fmt=jpeg

640?wx_fmt=jpeg

 

640?wx_fmt=jpeg

 

640?wx_fmt=jpeg

 

假设初始的二叉查找树只有三个节点,根节点值为9,左孩子值为8,右孩子值为12:

 

640?wx_fmt=png

 

接下来我们依次插入如下五个节点:7,6,5,4,3。依照二叉查找树的特性,结果会变成什么样呢?

 

640?wx_fmt=png

 

640?wx_fmt=jpeg

 

640?wx_fmt=jpeg

 

640?wx_fmt=jpeg

 

640?wx_fmt=jpeg

 

红黑树---------一种自平衡的 二叉查找树 

1.节点是红色或黑色。

2.根节点是黑色。

3.每个叶子节点都是黑色的空节点(NIL节点)。

4 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)

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

 

下图中这棵树,就是一颗典型的红黑树:

 

640?wx_fmt=png

 

640?wx_fmt=jpeg

 

640?wx_fmt=jpeg

 

640?wx_fmt=jpeg

 

 

什么情况下会破坏红黑树的规则,什么情况下不会破坏规则呢?我们举两个简单的栗子:

 

1.向原红黑树插入值为14的新节点:

 

640?wx_fmt=png

 

2.向原红黑树插入值为21的新节点:

 

640?wx_fmt=png

 

由于父节点22是红色节点,因此这种情况打破了红黑树的规则4(每个红色节点的两个子节点都是黑色),必须进行调整,使之重新符合红黑树的规则。

 

640?wx_fmt=jpeg

 

640?wx_fmt=jpeg

 

变色:

 

为了重新符合红黑树的规则,尝试把红色节点变为黑色,或者把黑色节点变为红色。

 

下图所表示的是红黑树的一部分,需要注意节点25并非根节点。因为节点21和节点22连续出现了红色,不符合规则4,所以把节点22从红色变成黑色:

 

 

640?wx_fmt=png

 

但这样并不算完,因为凭空多出的黑色节点打破了规则5,所以发生连锁反应,需要继续把节点25从黑色变成红色:

 

640?wx_fmt=png

 

此时仍然没有结束,因为节点25和节点27又形成了两个连续的红色节点,需要继续把节点27从红色变成黑色:

 

640?wx_fmt=png

(左旋右旋说明:https://www.jianshu.com/p/e136ec79235c)

左旋转:

左旋:以某个结点作为支点(旋转结点),其右子结点变为旋转结点的父结点,右子结点的左子结点变为旋转结点的右子结点,左子结点保持不变。如图3。

逆时针旋转红黑树的两个节点,使得父节点被自己的右孩子取代,而自己成为自己的左孩子。说起来很怪异,大家看下图:

 

640?wx_fmt=png

 

图中,身为右孩子的Y取代了X的位置,而X变成了自己的左孩子。此为左旋转。

 

右旋转:

右旋:以某个结点作为支点(旋转结点),其左子结点变为旋转结点的父结点,左子结点的右子结点变为旋转结点的左子结点,右子结点保持不变。

顺时针旋转红黑树的两个节点,使得父节点被自己的左孩子取代,而自己成为自己的右孩子。大家看下图:

 

640?wx_fmt=png

 

图中,身为左孩子的Y取代了X的位置,而X变成了自己的右孩子。此为右旋转。

 

640?wx_fmt=jpeg

 

640?wx_fmt=jpeg

 

我们以刚才插入节点21的情况为例:

 

640?wx_fmt=png

 

首先,我们需要做的是变色,把节点25及其下方的节点变色:

 

640?wx_fmt=png

 

此时节点17和节点25是连续的两个红色节点,那么把节点17变成黑色节点?恐怕不合适。这样一来不但打破了规则4,而且根据规则2(根节点是黑色),也不可能把节点13变成红色节点。

 

变色已无法解决问题,我们把节点13看做X,把节点17看做Y,像刚才的示意图那样进行左旋转:

 

640?wx_fmt=png

 

640?wx_fmt=png

 

640?wx_fmt=png

 

由于根节点必须是黑色节点,所以需要变色,变色结果如下:

 

640?wx_fmt=png

 

这样就结束了吗?并没有。因为其中两条路径(17 -> 8 -> 6 -> NIL)的黑色节点个数是4,其他路径的黑色节点个数是3,不符合规则5。

 

这时候我们需要把节点13看做X,节点8看做Y,像刚才的示意图那样进行右旋转:

 

640?wx_fmt=png

 

640?wx_fmt=png

 

640?wx_fmt=png

 

最后根据规则来进行变色:

 

640?wx_fmt=png

 

如此一来,我们的红黑树变得重新符合规则。这一个例子的调整过程比较复杂,经历了如下步骤:

 

变色 -> 左旋转 -> 变色 -> 右旋转 -> 变色

 

640?wx_fmt=jpeg

 

640?wx_fmt=jpeg

 

640?wx_fmt=jpeg

 

640?wx_fmt=jpeg

 

几点说明:

 

1. 关于红黑树自平衡的调整,插入和删除节点的时候都涉及到很多种Case,由于篇幅原因无法展开来一一列举,有兴趣的朋友可以参考维基百科,里面讲的非常清晰。

 

2.漫画中红黑树调整过程的示例是一种比较复杂的情形,没太看明白的小伙伴也不必钻牛角尖,关键要懂得红黑树自平衡调整的主体思想。

 

 

红黑树和AVL树(平衡二叉树)区别

本文转载至链接:https://blog.csdn.net/u010899985/article/details/80981053

一、AVL树(平衡二叉树)

(1)简介

AVL树是带有平衡条件的二叉查找树,一般是用平衡因子差值判断是否平衡并通过旋转来实现平衡,左右子树高度差不超过1,和红黑树相比,AVL树是严格的平衡二叉树,平衡条件必须满足(所有结点的左右子树高度差不超过1)。不管我们是执行插入还是删除操作,只要不满足上面的条件,就要通过旋转来保存平衡,而因为旋转非常耗时,由此我们可以知道AVL树适合用于插入与删除次数比较少,但查找多的情况

(2)局限性

由于维护这种高度平衡所付出的代价比从中获得的效率收益还大,故而实际的应用不多,更多的地方是用追求局部而不是非常严格整体平衡的红黑树。当然,如果应用场景中对插入删除不频繁,只是对查找要求较高,那么AVL还是较优于红黑树

(3)应用

1.Windows NI内核中广泛存在;

二、红黑树

(1)简介

一种二叉查找树,但在每个节点增加一个存储位表示结点的颜色,可以是红或黑(非红即黑)。通过对任何一条从根到叶子的路径上各个节点着色的方式的限制,红黑树确保没有一条路径会比其他路径长出两倍,因此,红黑树是一中弱平衡二叉树(由于是弱平衡,可以看到,在相同的节点情况下,AVL树的高度低于红黑树),相对于要求严格的AVL树来说,它的旋转次数少,插入最多两次旋转,删除最多三次旋转,所以对于搜索,插入,删除操作较多的情况下,我们就用红黑树

(2)性质

(1)结点非红即黑

(2)根结点是黑色的

(3)每个叶子节点(NULL节点)是黑色的

(4)每个红色节点的两个子节点都是黑色的。(不能有两连续的红色节点)

(5)从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。

注意:性质(5)保证红黑树的最长路径不超过最短路径的两倍。

(3)应用

1、广泛应用于C++的STL中,map和set底层都是用红黑树实现的。

 

 

漫画算法系列

 

  • 漫画算法:最小栈的实现

  • 漫画算法:判断 2 的乘方

  • 漫画算法:找出缺失的整数

  • 漫画算法:辗转相除法是什么鬼?

  • 漫画算法:什么是动态规划?(整合版)

  • 漫画算法:什么是跳跃表?

  • 漫画算法:什么是 B 树?

  • 漫画算法:什么是 B+ 树?

  • 漫画算法:什么是一致性哈希?

  • 漫画算法:无序数组排序后的最大相邻差值

  • 漫画算法:什么是 Bitmap 算法?

  • 漫画算法:Bitmap算法(进阶篇)

  • 漫画算法:什么是布隆算法?

  • 漫画算法:什么是 A* 寻路算法?

  • 漫画算法:什么是 Base64 算法?

  • 漫画算法:什么是 MD5 算法?

  • 漫画算法:如何破解 MD5 算法?

  • 漫画算法:什么是 SHA 系列算法?

  • 漫画算法:什么是 AES 算法?

  • 漫画算法:AES 算法的底层原理

转自:https://blog.csdn.net/p5deyt322jacs/article/details/78433942


http://chatgpt.dhexx.cn/article/EoeKcIeG.shtml

相关文章

红黑树是怎么实现的,看这篇真的就够了!

大家好&#xff0c;我是鸭血粉丝&#xff0c;又是一个元气满满的周一&#xff0c;今天带大家一文搞懂红黑树&#xff0c;友情提示&#xff1a;本文较长&#xff0c;建议先收藏再观看。 红黑树由来&#xff1a;在1972年由Rudolf Bayer发明的&#xff0c;当时被称为平衡二叉B树&…

红黑树解读与Java实现

红黑树解读与Java实现 概要 目录 红黑树的介绍红黑树的应用红黑树的时间复杂度和相关证明红黑树的基本操作&#xff0c;左右旋红黑树的基本操作&#xff0c;添加与调整红黑树的基本操作&#xff0c;删除与调整 一、红黑树的介绍 什么是红黑树&#xff1f; R-B Tree&#…

JDK14的新特性:JFR,JMC和JFR事件流

文章目录 简介JFRJMC创建JFR分析JFR JFR事件JFR事件流总结 简介 Java Flight Recorder&#xff08;JFR&#xff09;是JVM的诊断和性能分析工具。它可以收集有关JVM以及在其上运行的Java应用程序的数据。JFR是集成到JVM中的&#xff0c;所以JFR对JVM的性能影响非常小&#xff0…

Cocos2d-x利用jni调用java层代码

jni的意思是java本地调用&#xff0c;通过jni可以实现java层代码和其他语言写得代码进行交互。在cocos2d-x中&#xff0c;如果想要在c层调用java层的代码&#xff0c;就是通过jni技术。通过调用java层的代码&#xff0c;我们就可以在Android平台下实现一些引擎没有提供给我们的…

红黑树,学习红黑树,jdk1.8之后的新知识

红黑二叉树 1.引言 HashMap的基本结构是数组&#xff0c;链表和红黑树。以数组为基本形态&#xff0c;数组中的元素先以链表形式储存&#xff0c;当链表的长度超过8时&#xff08;包含数组上的那个链表头&#xff09;就会将链表转换为红黑树&#xff0c;以加快修改和查询效率…

JavaScript 红黑树

一、树的平衡性 为了能以较快的时间O(logN)来操作一棵树,我们需要保证树总是平衡的: 至少大部分是平衡的,那么时间复杂度也是接近O(logN)的也就是说树中每个节点左边的子孙节点的个数应该尽可能的等于右边的子孙节点的个数.常见的平衡树有哪些呢?AVL树: AVL树是最早的一种平衡…

最详细的对红黑树性质理解

红黑树的性质&#xff1a; 在了解红黑树之前&#xff0c;建议先去了解一下什么是二叉搜索树。 因为红黑树属于二叉搜索树特殊的分支&#xff0c;所以建议先去了解一下二叉搜索树。 二叉搜索树&#xff1a;https://blog.csdn.net/Falling_stars_/article/details/115536511 红…

JDK1.8之后,HashMap转变红黑树

当链表长度大于8并且数组长度大于64时&#xff0c;才会转换为红黑树 根据源码注释&#xff1a; 1.TreeNodes占用空间是普通Nodes的两倍。 只有当bin&#xff08;bin就是bucket-桶&#xff0c;即HashMap中hashCode值一样的元素保存的地方&#xff09;包含足够多的节点时才会转成…

jdk1.8的HashMap中的红黑树插入,为什么是红黑树而不是AVL树

jdk1.8HashMap的源码 树节点 static final class TreeNode<K,V> extends LinkedHashMap.Entry<K,V> {TreeNode<K,V> parent; // red-black tree linksTreeNode<K,V> left;TreeNode<K,V> right;TreeNode<K,V> prev; // needed to unli…

浅谈红黑树

这篇文章的删除操作参考这篇博客博客地址 聊红黑树之前我想先来谈谈B树&#xff08;多路平衡查找树&#xff09;&#xff0c;为什么来聊这个东西呢&#xff0c;其实红黑树就是一个B树。了解B树后对红黑树的理解会比较有帮助。 首先是2、3、4节点。 红黑树中单个黑节点对应B树中…

红黑树的理解与代码实现

红黑树 我们知道对于二叉搜索树而言&#xff0c;无法保证树的平衡性&#xff0c;从而使得进行操作的时候时间复杂度在O(logn)与O(n)之间。这样是不稳定的。而2-3树则借助于3-结点和临时的4-结点&#xff0c;通过分解&#xff0c;解决了平衡问题。例如对于插入&#xff0c;在最终…

图解TreeMap的红黑树平衡操作fixAfterInsertion(),接着手撕红黑树添加节点

一、前言 啥也不想说&#xff0c;就卷、卷技术&#xff1b;手撕红黑树搞起。 1、红黑树简介 红黑树就是一种平衡的二叉查找树&#xff0c;其有五个特点&#xff1a; 1.每个节点要么是红⾊&#xff0c;要么是⿊⾊&#xff1b; 2. 根节点⼀定是⿊⾊的&#xff1b; 3. 每个叶⼦…

有人在jdk源码里下毒【class.newInstance() bug复现】

如图 在用反射的时候&#xff0c;发现这个方法被idea划横杠了 稍加思索后发现是这方法从jdk9开始弃用了&#xff0c;倒不影响使用&#xff0c;对象还是能正常射出来&#xff0c;就是看着很难受 &#xff08;最近刚把本地开发机从8升到11&#xff0c;难怪&#xff09; 说下我…

红黑树理解以及Java实现

红黑树本身并不复杂&#xff0c;只是在插入删除的时候情况比较多&#xff0c;如果强行记忆的话会显得比较困难&#xff0c;而且容易忘记。所以以前对红黑树一直没有很好的掌握。恰好这次借着复习数据结构的机会&#xff0c;静下心来仔细的学习了一下红黑树&#xff0c;并用Java…

Java 9 vs Java 8:引入模块化和JShell的全面升级

Java 9 是 Java 语言的一个重大版本升级&#xff0c;带来了许多新的特性和改进。 在本篇博客中&#xff0c;我将为您介绍 Java 9 的一些重要特性。 &#x1f3c5; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; 目录 一、模块化二、JShell三…

HashMap 在 JDK 1.8 后新增的红黑树结构

读完本文你将了解到&#xff1a; 点击查看 Java 集合框架深入理解 系列 - - 乾杯传统 HashMap 的缺点HashMap 在 JDK 18 中新增的数据结构 红黑树HashMap 中关于红黑树的三个关键参数HashMap 在 JDK 18 中新增的操作桶的树形化 treeifyBinHashMap 在 JDK 18 中新增的操作 红黑树…

epoll底层红黑树使用部分源码剖析:为什么使用红黑树以及如何使用红黑树

我们知道epoll的底层使用了红黑树来管理文件描述符&#xff0c;为什么会选择红黑树这种结构呢&#xff1f; 以下是个人理解&#xff1a; epoll和poll的一个很大的区别在于&#xff0c;poll每次调用时都会存在一个将pollfd结构体数组中的每个结构体元素从用户态向内核态中的一…

HashMap在jdk1.8为何引入了红黑树?

原创不易,麻烦点个关注,点个赞,谢谢各位。 二叉查找树 二叉查找树,也称有序二叉树(ordered binary tree),或已排序二叉树(sorted binary tree),是指一棵空树或者具有下列性质的二叉树: 若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若任…

从电路的角度理解特征阻抗

传输显得特征阻抗不是真实的电阻&#xff0c;微波技术课程会从波的角度描述特征阻抗&#xff0c;这次试图从电路的角度来理解 无损传输线是分布的L C 网络&#xff0c;假设是无限长传输线 从a,b两点看入的阻抗是相等的&#xff0c;所以可以简化成下图&#xff1a; 化简可得 这…

同轴电缆阻抗总结(电阻、阻抗、特性阻抗)

文章目录 同轴电缆电阻、阻抗、特性阻抗电阻阻抗&#xff08;Impedance&#xff09;特性阻抗 总结 同轴电缆 同轴电缆是一种电线及信号传输线&#xff0c;一般是由四层物料造成&#xff1a;最内里是一条导电铜线&#xff0c;线的外面有一层塑胶&#xff08;作绝缘体、电介质之…