JavaScript 红黑树

article/2025/9/21 0:42:44

一、树的平衡性

  •  为了能以较快的时间O(logN)来操作一棵树,我们需要保证树总是平衡的:
    • 至少大部分是平衡的,那么时间复杂度也是接近O(logN)的
    • 也就是说树中每个节点左边的子孙节点的个数应该尽可能的等于右边的子孙节点的个数.
    • 常见的平衡树有哪些呢?
  • AVL树:
    • AVL树是最早的一种平衡树.它有些办法保持树的平衡(每个节点多存储了一个额外的数据)
    • 因为AVL树是平衡的,所以时间复杂度也是O(IogN).
    • 但是,每次插入/删除操作相对于红黑树效率都不高,所以整体效率不如红黑树
  • 红黑树:
    • 红黑树也通过一些特性来保持树的平衡.
    • 因为是平衡树,所以时间复杂度也是在O(logN).
    • 另外插入/删除等操作,红黑树的性能要优于AVL树,所以现在平衡树的应用基本都是红黑树.

二、认识红黑树 

红黑树的规则 

  •  红黑树,除了符合二叉搜索树的基本规则外,还添加了一下特性: 
  1. 节点是红色或黑色。
  2. .根节点是黑色。 
  3. 每个叶子节点都是黑色的空节点(NIL节点)。
  4. 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
  5. 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。

 这些规则会让人一头雾水
        完成搞不懂规则叠加起来,怎么让一棵树平衡的.
        但是它们还是被一些聪明的人发明出来了. 

 

红黑树的相对平衡

 前面的约束,确保了红黑树的关键特性:

  • 从根到叶子的最长可能路径,不会超过最短可能路径的两倍长.
  • 结果就是这个树基本是平衡的.
  • 虽然没有做到绝对的平衡,但是可以保证在最坏的情况下,依然是高效的.

为什么可以做到最长路径不超过最短路径的两倍呢? 

  • 性质4决定了路径不能有两个相连的红色节点
  • 最短的可能路径都是黑色节点.
  • 最长的可能路径是红色和黑色交替.
  • 性质5所有路径都有相同数目的黑色节点.
  • 这就表明了没有路径能多余任何其他路径的两倍长 

三、红黑树的变换 

变色 

插入一个新节点时,有可能树不再平衡,可以通过三种方式的变换让树保持平衡。  

  • 换色 - 左旋转 - 右旋转 

变色: 

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

首先,需要知道插入的新节点通常都是红色节点。 

  • 因为在插入节点为红色的时候,有可能插入一次是不违反红黑树任何规则的
  • 而插入黑色节点,必然会导致有一条路径上多了黑色节点,这是很难调整的。
  • 红色节点可能导致出现红红相连的情况,但是这种情况可以通过颜色调换和旋转来调整 

旋转

左旋转 

  • 逆时针旋转红黑树的两个节点,使得父节点被自己的右孩子取代,而自己成为自己的左孩子。 

 

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

右旋转: 

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

  • 图中,身为 左孩子的Y取代了X的位置,而x变成了Y的右孩子。

四、插入操作的情况分析 

插入操作  

  • 接下来,讨论一下插入的情况:
    • 设要插入的节点为N,其父节点为P
    • 其祖父节点为G,其父亲的兄弟节点为U(即P和U是一个同一个节点的子节点)。 
  • 情况一: 
    • 新节点N位于树的根上,没有父节点。
    • 这种情况下,我们直接将红色变换为黑色即可,这样满足性质2.
  • 情况二:
    • 新节点的父节点P是黑色
    • 性质4没有失效(新节点是红色的),性质5也没有任何问题
    • 尽管新节点N有两个黑色的叶子节点nill,但是新节点N是红色的,所以通过它的路径中黑色节点的个数依然相同,满足性质5
  • 情况三:
    • P为红色,U也是红色
    • 父红叔红祖黑 -> 父黑叔黑祖红
  • 操作方案:
    • 将P和U变换为黑色,并且将G变换为红色.
    • 现在新节点N有了一个黑色的父节点P所以每条路径上黑色节点的数目没有改变.
    • 而从更高的路径上,必然都会经过G节点,所以那些路径的黑色节点数目也是不变的.符合性质5.
  • 可能出现的问题:
    • 但是, N的祖父节点G的父节点也可能是红色,这就违反了性质3,可以递归的调整颜色.
    • 但是如果递归调整颜色到了根节点,就需要进行旋转了待会儿我们的例子中会遇到这个问题.

 

  •  情况四:
    • N的数数U是黑节点,且N是做孩子.父红叔黑祖黑N是左儿子
      • 父黑
      • 祖红
      • 右旋转
    • 操作方案:
      • 对祖父节点G进行依次右旋转
      • 在旋转查收的树中,以前的父节点P现在是新节点已经以前祖父节点G的父节点.
      • 交换以前的父节点P和祖父节点G的颜色.(P为黑色, G变成红色–G原来一定是黑色,为什么?)
      • B节点向右平移,称为G节点的左子节点.

 

  • 情况五:
    • N的叔叔U是黑色节点,且N是有孩子.父红叔黑祖黑,N是右儿子
      • 以P为根,左旋转 
    • 将P作为新插入的红色节点考虑即可->自己变成黑色
      • 祖变成红色
      • 以祖为根,进行右旋转
  • 操作方案:
    • 对P节点进行依次左旋转,形成情况四的结果.
    • 对祖父节点G进行一次右旋转,并且改变颜色即可

 

五、红黑树的案例 

  • 案例:1 2 3 4 5 6 7 8 9 10
  • 案例:依次插入10 9 8 7 6 5 4 3 2 1

 

 

 

 

 

 

删除&代码 

  • 红黑树的删除
    • 我们已经学习过了二叉搜索树的删除操作,比较复杂.
    • 我们已经学习过了红黑树的插入规则,比较复杂.
    • 红黑树的删除操作呢? 
    • 它就需要将两个复杂的操作结合起来考虑,所以难度非常大
  • 插入和删除的代码实现:
    • 插入的步骤我们已经一步步的进行了分析.
    • 分析完成后,写出插入的代码并不是很难.
    • 删除也需要按照插入一样,分成很多种情况,然后写出最终的代码形式.

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

相关文章

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

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

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

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

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;作绝缘体、电介质之…

传输线阻抗方程的推导

在传输线理论中&#xff0c;当一段特征阻抗为 Z 0 Z_0 Z0​ 的传输线的终端连接了一个阻抗为 Z L Z_L ZL​ 的负载时&#xff0c;看向这段传输线的输入阻抗 Z i n Z_{in} Zin​ 将不再是 Z 0 Z_0 Z0​。 传输线阻抗方程 (Transmission Line Impedance Equation) 就是计算…

PCB阻抗计算

阻抗匹配是指在能量传输时&#xff0c;要求负载阻抗要和传输线的特征阻抗相等&#xff0c;此时的传输不会产生反射&#xff0c;这表明所有能量都被负载吸收了。反之则在传输中有能量损失。在高速PCB设计中&#xff0c;阻抗的匹配与否关系到信号的质量优劣&#xff0c;下面简单介…

特征阻抗和阻抗匹配_没有诸如对象关系阻抗不匹配之类的东西

特征阻抗和阻抗匹配 过去十年来&#xff0c;ORM的许多批评都错了这一点&#xff0c;因为它不准确。 到本文结尾&#xff0c;我们将得出以下结论&#xff1a; 关系&#xff08;数据&#xff09;模型和面向对象的模型之间没有显着差异 如何得出这个结论&#xff1f; 继续阅读&a…

传输线特征阻抗计算

一直有很多人问我阻抗怎么计算的. 人家问多了,我想给大家整理个材料,于己于人都是个方便.如果大家还有什么问题或者文档有什么错误,欢迎讨论与指教! 在计算阻抗之前,我想很有必yi要理解这儿阻抗的意义 传输线阻抗的由来以及意义 传输线阻抗是从电报方程推导出来(具体可以查询微…

PCB特征阻抗计算

见教程&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1V4UbEoKfMD1bilwu-Qwdyg 密码&#xff1a;ml6t

射频特征阻抗

Characteris Impendance(特性阻抗&#xff0c;也称为‘特征阻抗’)是我们经常看到并使用自己的术语之一&#xff0c;但非常模糊且难以解释。以下是来自几个不同来源的Characteris Impendance(特性阻抗)的一些定义。 &#xff08;如果您检查10个不同的来源&#xff0c;您会看到1…