首页 > 其他分享 >红黑树插入与删除操作的基本规则

红黑树插入与删除操作的基本规则

时间:2025-01-19 17:54:03浏览次数:1  
标签:翻色 删除 -- father 插入 grandf 红黑树 节点

刷题又久违刷到了红黑树的知识,才发现上次学完之后没有及时留下笔记,现在又回到了一知半解的状态。写技术笔记是多么重要啊(喝老鼠药.jpg),以下为这次学到知识的简单总结。

通俗来说

红黑树更像是一种有规则的“交通系统”,每个交叉口是一个节点,红色代表“警示”或“等待”的信号,黑色代表“通行”的信号。红色的交叉口不能连续,因为连续的等待会导致交通堵塞。所以,交叉口需要通过调控信号来保证交通的流畅和畅通,避免拥堵。这些规则确保了无论交通流量如何变化,整体的交通系统保持稳定高效。

更有网友云:左根右,根叶黑。不红红,黑路同。

红黑树基本规则

红黑树是一棵二叉查找树,即每个节点都有最多两个子节点的树。它的特点是每个节点都带有颜色(红色或黑色),通过特定的规则来保持树的平衡,确保操作(如插入、删除、查找)在最坏情况下的时间复杂度为O(log n)。

数值规则

  • 左子树的值<父节点的值<右子树的值

这意味着,红黑树和普通的二叉查找树一样,节点的顺序是有要求的。

颜色规则

  • 根节点为黑色
  • 叶节点(NIL)为黑色
  • 红节点的子节点必为黑色:不能出现两个连续的红节点
  • 任何点到其可达叶节点的路径上,都经过相同数量的黑节点

20250108102356

平衡规则

平衡因子 优点
AVL树 任一节点左右子树高度差绝对值不超过1 查询更高效
红黑树 任一节点左右子树高度差不超过2倍 频繁插入和删除更高效
  • 插入操作

    默认插入节点为红时,讨论cur节点在以下位置的情况

    • 根节点:翻黑色

    • uncle节点为红:翻色

      uncle/father/grandf翻色,往上递归判定grandf的uncle/father是否合法;
      20250108115206

    • uncle节点为黑:旋转后翻色

      • LL型

        father为根,grandf右旋--翻色

      • RR型

        father为根,grandf左旋--翻色

      • LR型

        cur为根,father左旋,grandf右旋--翻色
        20250108115241

      • RL型

        cur为根,father左旋,grandf右旋--翻色

  • 删除操作

举例

插入:17 18 23 34 27 15 9 6 8 5 25。转换为红黑树后如图:

20250108114158

友情链接

B站--红黑树动画演示

OIWIKI--数据结构:红黑树

标签:翻色,删除,--,father,插入,grandf,红黑树,节点
From: https://www.cnblogs.com/W-enzy/p/18679747

相关文章

  • Java学习,删除集合指定元素
    Java删除集合中指定元素,通常依赖于集合具体类型。不同的集合类型(如ArrayList,HashSet,LinkedList等)提供了不同的方法来执行此操作。使用ArrayList:importjava.util.ArrayList;importjava.util.List; publicclassMain{  publicstaticvoidmain(String[]ar......
  • Mac里面的“其他”怎么删除,你不得不知的技巧
    在使用Mac时,很多用户都会发现存储空间里有一项“其他”类别占用了不少空间,但又不清楚这些文件究竟来自何处。实际上,“其他”包含了除“应用程序”“文稿”“音乐”“照片”“视频”等常见类别外的各种类型文件,包括系统缓存、临时文件、插件、虚拟机镜像、旧的iOS设备备份等。本......
  • 前端必知必会-Node.js连接MongoDB 删除集合
    文章目录Node.js连接MongoDB删除集合删除集合db.dropCollection总结Node.js连接MongoDB删除集合删除集合您可以使用drop()方法删除表或MongoDB中所谓的集合。drop()方法采用包含错误对象和结果参数的回调函数,如果成功删除集合,则返回true,否则返回false。......
  • PTA:一维数组 简化的插入排序
    本题要求编写程序,将一个给定的整数插到原本有序的整数序列中,使结果序列仍然有序。输入格式:输入在第一行先给出非负整数N(<10);第二行给出N个从小到大排好顺序的整数;第三行给出一个整数X。输出格式:在一行内输出将X插入后仍然从小到大有序的整数序列,每个数字后面有一个空格。输......
  • 算法2-25 有序单链表删除重复元素(附加代码模式)
    题目描述根据一个递增的整数序列构造有序单链表,删除其中的重复元素本题是附加代码模式,主函数main和打印链表的代码会自动附加在同学们提交的代码后面,请同学们在提交的时候注释附加代码。附加代码如下:void PrintList(const List &list){    Node *p = list->nex......
  • 【Linux】如何在 Linux 中删除符号链接?
    在Linux系统中,符号链接(SymbolicLink,简称Symlink)是一种非常实用的文件系统对象,它类似于Windows系统中的快捷方式。符号链接可以指向文件或目录,为用户提供了便捷的访问路径。然而,有时候我们可能需要删除不再需要的符号链接,本文将详细为你介绍在Linux中删除符号链接的各种方......
  • 网站后台无法删除东西
    您好,当您遇到网站后台无法删除文件或数据的问题时,这可能是由多个因素引起的。以下是一些常见的原因及其对应的解决方案:权限设置不当:检查网站根目录及其子文件夹的权限设置是否正确。确保Web服务器用户(如www-data、nginx)拥有足够的读写权限来访问相关文件和目录。可以使用chmo......
  • win10-Git-拉代码无权限-推送代码失败-配置用户密码无效-处理方案-删除凭证
    win10-Git-拉代码无权限-推送代码失败-配置用户密码无效-处理方案-删除凭证删除已保存的凭证重新操作删除已保存的凭证控制面板>用户账户>凭证管理器选择Windos凭证下方找到普通凭据,删除操作失败的地址重新操作重新拉取/推送Git代码,会弹出输入账号密码提......
  • 插入数据
    插入数据可以通过在集合对象上调用add方法往集合中插入一条记录。还是用待办事项清单的例子,比如我们想新增一个待办事项:db.collection('todos').add({//data字段表示需新增的JSON数据data:{//_id:'todo-identifiant-aleatoire',//可选自定义_id,在此处场......
  • python 按时间戳删除32×32数组的前2列和后9列(批量处理多个txt)
    前面是单个txt这次批量处理多个txt将所得结果保存到另一个文件夹Python首先处理一个txt内容中多个时间戳,每个时间戳\d{4}-\d{2}-\d{2}\d{2}:\d{2}:\d{2}$对应32行×32列数组,删除数组前2列和后9列。其次采用第一步方法,批量处理某文件夹内所有txt文件,将结果批量存到另一个文件......