红黑树(算法导论版)

2023-11-14

1  定义

(1)每个节点是红色或者黑色的。

(2)根节点是黑色的。

(3)所有叶子结点(NIL)都是黑色的。

(4)如果一个节点是红色,则它的两个子节点都是黑色的。

(5)对每个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点。

2  性质

从根到叶节点的最长的可能路径不多于最短的可能路径的两倍。

3  平衡操作

3.1  插入

1、被插入的节点是根节点,直接把此节点设为黑色。

2、被插入的节点的父节点是黑色,当前节点设为红色,然后什么也不需要做。

3、被插入的节点的父节点是红色

(1)当前节点的叔节点也是红色

        ① 将父节点设为黑色

        ② 将叔节点设为黑色

        ③ 将祖父节点设为红色

        ④ 将祖父节点设为当前节点(红色节点);之后继续对当前节点进行操作。

(2)当前节点的叔节点是黑色,且当前节点是其父节点的右孩子

        ① 将父节点作为新的当前节点

        ② 以新的当前节点为支点进行左旋

(3)当前节点的叔节点是黑色,且当前节点是其父节点的左孩子

        ① 将父节点设为黑色

        ② 将祖父节点设为红色

        ③ 以祖父节点为支点进行右旋

3.2  删除

红黑树的删除操作是在二叉搜索树的删除操作后,再去维护红黑树的性质。首先,如果我们删除的是红色点,那么对红黑树的性质没有影响,不需要为了维护红黑树的性质而做额外的操作;如果删除的是一个黑色点,那么我们一定会提上来一个点(类比二叉排序树的节点删除操作),那么我们就把黑色点累加到提上来的点上,也就是说这个点上包含两个颜色(红+黑 或者 黑+黑),这样的话,我们虽然删掉了一个黑色点,但是它的颜色被留下来了,此时仍然可以满足任意一条路径上所有的黑色点的数目都是一样的。

1、x指向一个“红 + 黑”节点,将x设为一个黑节点即可

2、x指向根,将x设为一个黑节点即可

3.1、x的兄弟节点是红色

        (1)将x的兄弟节点设为黑色

        (2)将x的父节点设为红色

        (3)对x的父节点进行左旋

        (4)左旋后,重新设置x的兄弟节点。

(注:3.1步做完之后当前节点x的兄弟节点一定是黑色,即3.1步执行结束后转换为3.2、3.3、3.4)

3.2、x的兄弟节点是黑色,x的兄弟节点的两个孩子都是黑色

        (1)将x的兄弟节点设为红色

        (2)设置x的父节点为新的x节点(将当前节点“黑+黑”的其中一个黑,赋给父节点)

注:3.2步完成之后的效果是将处理的节点往上移动一层

3.3、x的兄弟节点是黑色,x的兄弟节点的左孩子是红色,右孩子是黑色

        (1)将x兄弟节点的左孩子设为黑色

        (2)将x兄弟节点设为红色

        (3)对x的兄弟节点进行右旋

        (4)右旋后,重新设置x的兄弟节点

注:3.3步的作用是将情况3.3转换成情况3.4

3.4、x的兄弟节点是黑色,x的兄弟节点的右孩子是红色的,x的兄弟节点的左孩子任意颜色

        (1)将x父节点颜色赋值给x的兄弟节点

        (2)将x父节点设置为黑色

        (3)将x兄弟节点的右子节点设为黑色

        (4)对x的父节点进行左旋

注:执行完3.4就可解决红黑树的删除操作导致的性质不满足问题

红黑树的代码实现可移步至 红黑树的实现(C++)_青衫客36的博客-CSDN博客

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

红黑树(算法导论版) 的相关文章

  • 如何确保事务提交后才执行异步操作

    参考博客TransactionSynchronizationManager和TransactionSynchronizationAdapter 场景 业务流程背景 对于 法律法规 法规库 标签管理 列表中的某一条数据 操作完标注和解析按钮后

随机推荐

  • Angular离线API文档安装指南

    需要的材料 nginx 官方angularjs zip 完整包 步骤 1 先上www angular org 下载个完整的zip包 2 到nginx 网站下载 nginx 3 修改 nginx 1 6 2 conf nginx conf 文
  • 利用win10自带的工具测硬盘读写速度

    利用win10自带的硬盘测试工具测读写速度 一 win q 打开搜索框 输入 cmd 找到命令提示符 右击以管理员身份运行 二 在命令框里输入 winsat disk 是默认测试系统盘的速度 不出意外都是C盘 三 当我们要想测试其他盘的时候
  • MySQL学习笔记——MySQL数据类型(拉勾教育数据分析实战训练营学习笔记)

    MySQL学习笔记 MySQL数据类型 MySQL数据库中 每一条数据都有其数据类型 主要可以分为数值型 字符串型和日期时间型三大类 说明如下所示 数值类型 TINYINT 一个非常小的整数 占1字节 如果是有符号 范围是 128 127
  • MFC窗口销毁过程

    MFC窗口销毁过程 考虑单窗口情况 假设自己通过new创建了一个窗口对象pWnd 然后pWnd gt Create 则销毁窗口的调用次序 1 手工调用pWnd gt DestroyWindow 2 DestroyWin
  • Elasticsearch实战-磁盘IO被打满

    背景 事情是这样的 一天下午4点42分左右 业务反馈我开发的服务在测试环境出现问题 返回资源数据是0 查日志发现是ES访问超时 相当于数据库挂了 持续了20多分钟自己恢复 咨询了ES团队 最终得到下面的答复 当前集群现状 1 当前集群数据I
  • python爬取研究生招生网招生信息

    import requests from bs4 import BeautifulSoup from pandas core frame import DataFrame import re import time class Gradua
  • Nginx惊群问题

    Nginx惊群问题 1 简介 简单来说 多线程 多进程 linux下线程进程也没有多大区别 等待同一个socket事件 当这个事件发生时 这些线程 进程被同时唤醒 就是惊群 可以想见 效率很低下 许多进程被内核重新调度唤醒 同时去响应这一个
  • 07.JavaWeb-Vue+elementUI

    1 Vue 功能替代JavaScript和jQuery 基于JavaScript实现的前端框架 1 1配置Vue 1 1 1引入vue库 方法一 通过cdn链接引入最新版本的vue 可能会慢些 方法二 将vue库下载到本地 通过相对路径引入
  • SpringFramework核心技术三:Spring的验证机制

    Spring验证 Spring 3引入了对其验证支持的几项增强 首先 现在完全支持JSR 303 Bean验证API 其次 当以编程方式使用时 Spring的DataBinder现在可以验证对象并绑定到它们 第三 Spring MVC现在支
  • 【已解决】容器镜像安装vim的踩坑之路

    一 背景 在部署 Elasticsearch 7 17 7 版本时 进入到改容器后 发现该镜像没有vi 同时使用apt也无法正常安装 于是百度找解决方案 一步一坑 最后完美解决 二 解决 首先进入镜像中 docker exec it es
  • springboot+mysql物流车辆管理系统-计算机设计源码84722

    摘要 由于数据库和数据仓库技术的快速发展 物流车辆管理系统建设越来越向模块化 智能化 自我服务和管理科学化的方向发展 物流车辆管理系统对处理对象和服务对象 自身的系统结构 处理能力 都将适应技术发展的要求发生重大的变化 物流车辆管理系统除了
  • 基于深度学习的智慧城市火灾检测方法

    1 文章信息 本次介绍的文章是在2022年发表在Electronics的一篇文章 文章题目为 Fire Detection Method in Smart CityEnvironments Using a Deep Learning Bas
  • 工厂方法模式-Factory Method Pattern

    工厂方法模式 Factory Method Pattern 工厂方法模式 Factory Method Pattern 定义一个用于创建对象的接口 让子类决定将哪一个类实例化 工厂方法模式让一个类的实例化延迟到其子类 工厂方法模式又简称为工
  • 【爬虫】九、综合案例之m3u8文件

    视频网站常规处理方法 用户上传视频 gt 转码 处理视频 gt 切片处理 把单个文件进行拆分 一般把拆分好的文件放到M3U8 txt json的文本中 用户在拖动进度条时则进入到某个分片中 需要一个文件记录 1 视频播放顺序 2 视频存放路
  • 通过“hay的素质理论“,分析个人的学习能力

    1 学习能力是什么 大家觉得 学习能力不就是看书更快 更好的理解记忆 考试拿高分的能力吗 到了职场 还固步自封在应试教育阶段 就有点呵呵了 虽然面试官也会问 最近有看什么书啊 能给我们讲讲里面内容吗 但面试官绝对不只是想了解 你是不是爱看书
  • webgl学习之路(三)——透视投影矩阵的推导过程

    关于透视投影矩阵的讲解 网上有不少教程 但是有一点大家基本上都没有讲清楚 就是z轴坐标 这里的Z轴相当于景深 的推导过程 基本上是一笔带过 下面先从头开始讲推导过程 再慢慢说Z轴的推导过程 透视投影如下图 透视投影的过程如下 所观察的物体在
  • 前端实现拖拽效果改变元素顺序

    文章目录 前言 一 实现效果 二 拖拽API 1 代码 2 遇见问题 总结 前言 在一次工作中 前端要实现通过鼠标实现拖拽改变顺序的功能 之前没有接触过拖拽这一块所以刚开始一筹莫展 幸运的是在查阅学习中实现了前端拖拽功能 一 实现效果 二
  • python对离散功率点进行积分得到电耗

    data pd read csv r C Users EDY Desktop csv data from scipy integrate import trapz scipy integrate trapz y x scipy integr
  • PCL 将对象模板与点云对齐

    目录 一 算法概述 二 代码实现 三 结果展示 四 相关链接 五 实验数据 一 算法概述 这是PCL官网给出的一个模版匹配教程 用来说明如何将其他教程中介绍的一些工具结合起来解决一个更高层次的问题 即将以前捕获的对象模型与一些新捕获的数据对
  • 红黑树(算法导论版)

    1 定义 1 每个节点是红色或者黑色的 2 根节点是黑色的 3 所有叶子结点 NIL 都是黑色的 4 如果一个节点是红色 则它的两个子节点都是黑色的 5 对每个节点 从该节点到其所有后代叶节点的简单路径上 均包含相同数目的黑色节点 2 性质