高阶数据结构(2)-----红黑树(未完成)

一)红黑树的基本概念和基本性质:

1)红黑树就是一种高度平衡的二叉搜索树,但是在每一个节点上面都增加了一个存储位来表示结点的颜色,可以是红色或者是黑色,通过对任何一条从根节点到叶子节点上面的路径各个节点着色方式的限制,红黑树会自动确保没有一条路经会比其他路径的长度高出两倍,而是接近平衡的

2)红黑树最长路径是最短路径的两倍

3)每一个节点不是红色就是黑色

4)根节点是黑色的

5)如果一个节点是红色的,那么他的左右孩子的节点都是黑色的,说明红黑树没有两个连续相同的红色节点

6)对于每一个节点,从该节点到达后代的叶子结点的所有简单路径里面,均包含相同数目的黑色节点(每一条路径上都包含着相同数目的黑色节点,路径的计算必须指向空)

在红黑树中,对于每个节点,从该节点到其所有后代叶子节点的简单路径上,应包含相同数量的黑色节点,这也是红黑树的基本性质之一。

在计算路径上的黑色节点数量时,通常会包括空节点(NIL节点)因为空节点被视为黑色节点的一部分,并且它们对于保持红黑树的平衡性和性质是必要的,所以,在判断从任意节点到达后代叶子节点的所有简单路径是否包含相同数量的黑色节点时,应该将空节点(NIL节点)也计算在内

7)每一个叶子节点都是黑色的,此处的叶子节点指的是空节点

8)红黑树的最长路径:路径上节点黑红相间,一黑一红,最短路径:路径上全部是黑色节点

9)假设黑色节点总共有X个,整棵树的节点数量在[X,2X]之间

当总节点个数是X个的时候最短路径的长度:logX

当总结点个数是2X的时候最短路径长度是:logX+1,logX趋近于logN

所以最终总结:

最短路径长度为:logN

最长路径长度为:2logN

10)一个正常的二叉树,不会出现这种一条路径全部都是黑色的情况

 二)红黑树的插入:

1)首先要明白,插入的节点必须是红色的节点,如果最终插入的是黑色的节点,因为我们要最终保证每一条路径上都有数目相同的黑色节点,其他路经都必须得新增黑色节点,但是此时新插入的是一个黑色节点,其他路经也没有办法新增节点呀,但是此时就不满足一个条件,两个红色节点挨在一起了,所以需要调节成合适的颜色

2)红黑树是在二叉搜索树的基础上加上其平衡限制条件,因此红黑树的插入可以分为两步

2.1)按照二叉搜索树的规则插入新节点

2.2)检测插入新节点之后,判断红黑树的性质是否已经遭受到了破坏,因为新节点的默认颜色是红色,因此如果双亲结点的颜色是黑色,那么其实本质上并没有违反红黑树的任何性质,那么就不需要进行调整,但是当插入的新节点的双亲结点是红色的时候,就违反了不能有连在一起的红色节点,此时需要对红黑树来分情况进行讨论:

约定current为当前新插入的节点,parent为父亲节点,grandfather是祖父节点,uncle为叔叔节点

一)一共是有两种大的情况:parent是在grandfather的left节点:
1)current为红色节点,parent是红色节点,grandfather是黑色节点,uncle存在是红色节点,下面都是默认讨论curent是parent的左子树,但是实际情况current下可能是parent的左子树,还有可能是parent的右子树;

1.1)下面只是考虑到了grandfather以下的节点:发现只需要把parent节点和uncle节点变成黑色,就可以简单的满足以grandfather为根节点的树,从根节点到叶子节点的树是一颗标准的红黑树,此时gp的左子树一定是有一个黑色节点的;

1.2)第二个横线更深一步考虑,当考虑到granfather的父亲节点的时候,当grandfather的父亲节点是黑色的时候或者是grandfather节点是红色的时候,需要再进一步分情况进行讨论:

1.3)当grandfather的父亲节点是黑色的时候说明,grandfather的另一个孩子也是黑色节点

此时如果将grandfather的这个节点的父亲节点是一个黑色的节点那么如果只是单纯的将p和u变成黑色是万万不可以的,这样只会增加黑色节点的个数

1.4)假设grandfather的父亲节点是红色,此时可以分析出gp的左孩子一定是黑色的

2)current为红色,parent是红色,grandfather是黑色,uncle不存在或者是uncle是黑色

此时current下面一定有子树其他节点:是再调整的过程中current变成红色的

先进行右旋:

然后修改颜色:

3)current是红色,parent是红色,grandFather是黑色,uncle不存在或者uncle是黑色

二)第二种情况parent是在grandfather的right节点:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/134099.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java:逆序排序的三种方法

// 逆序第一种方法 public static void main(String[] args) {int arr[] {11, 22, 33, 44, 55, 66};for (int i arr.length-1; i > 0; i--) {System.out.print("\t"arr[i]);}}缺点:这个是直接逆转,如果里面是随机数没办法比较 逆序第二种…

在ubuntu18.04上编译C++版本jsoncpp/opencv/onnxruntime且如何配置CMakelist把他们用起来~

这篇文章背景是笔者在ubuntu上编译C代码,依赖一些包,然后需要编译并配置到CMakelist做的笔记。主要也是一直不太懂CMakellist,做个笔记以防忘记,也给读者提供一站式的参考,可能您需要的不是这几个包,但大同…

【多区域电力系统模型】三区域电力系统的LQR和模糊逻辑控制(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

【Python从入门到进阶】35、selenium基本语法学习

接上篇《34、selenium基本概念及安装流程》 上一篇我们介绍了selenium技术的基础概念以及安装和调用的流程,本篇我们来学习selenium的基本语法,包括元素定位以及访问元素信息的操作。 一、元素定位 Selenium元素定位是指通过特定的方法在网页中准确定位…

【教程】IDEA操作GIT

不小心推送代码之后 进行回退 1 找到需要回退的记录 比如要回退13分钟之前提交的代码 选中 右键还原提交 最后再重新推送被还原的提交 就可以了

ArcGIS10.1软件安装教程

ArcGIS10.1中英文(32/64位)下载地址: 链接: https://pan.baidu.com/s/1Ksm112WaKMMk6La9ircCng 密码:t70f 安装步骤: 1、我们对安装包进行解压,直接鼠标右击解压即可。 2、 打开我们解压的文件夹&#…

【抖音小游戏】 Unity制作抖音小游戏方案 最新完整详细教程来袭【持续更新】

前言【抖音小游戏】 Unity制作抖音小游戏方案 最新完整详细教程来袭【持续更新】一、相关准备工作1.1 用到的相关网址1.2 注册字节开发者后台账号二、相关集成工作2.1 下载需要的集成资源2.2 安装StarkSDK和starksdk-unity-tools工具包2.3 搭建测试场景三、构建发布3.1 发布Nat…

01_网络编程_传统IO

网络编程 1.什么是网络编程 在网络通信协议下,不同计算机上运行的程序,进行的数据传输。 如果想把一个计算的结果,或者是电脑上的文件通过网络传递给你的朋友,就需要用到网络编程。 在实际生活中,网络通信无处不在…

linux相关知识以及有关指令3

在linux的世界中我们首先要有万物皆文件的概念,那么在系统中有那么多的文件,我们该怎么区分呢?文章目录 1. 文件分类2. 文件的权限1). 拥有者和所属组以及other2). 文件的权限3). 粘滞位4). 对于权限修改的拓展知识点a.修改权限b.修改拥有者所…

学校项目培训之Carla仿真平台之安装Carla

官网:http://carla.org/ 写在前面 由于安装都写了很多东西,所以我单独将安装弄出来记录一下。 如果你在安装9.12版本的时候遇到了很多问题,你可以考虑以下几点: - 楼梯可能不太行,需要更换,这是我实践得到的…

Jmeter 实现 mqtt 协议压力测试

1. 下载jmeter,解压 https://jmeter.apache.org/download_jmeter.cgi 以 5.4.3 为例,下载地址: https://dlcdn.apache.org//jmeter/binaries/apache-jmeter-5.4.3.zip linux下解压: unzip apache-jmeter-5.4.3.zip 2. 下载m…

Docker实战技巧(一):Kubernetes基础操作实战

Kubernetes定位在Saas层,重点解决了微服务大规模部署时的服务编排问题 1、关闭防火墙并设置开机禁用   systemctl stop firewalld   systemctl disable firewalld 2、配置repo   cd /etc/yum.repos.d/   下载Docker repo   wget https://mirrors.aliyun.com/docker-…

在工作流引擎设计领域,是否自动计算未来的处理人的设计模式有哪些?

概述 流程的第一个节点发送下去的时候,就要把以后所有节点的处理人计算出来,能清楚的知道每个节点都是那些人处理. 以驰骋bpm为例来说明这个设计 计算未来处理人包括抄送节点、与待办节点. 默认的模式为:每个节点发送的时候即使计算,就是不计算未来处理…

JavaScript 中的 `this` 指向问题与其在加密中的应用

JS中的 this 关键字是一个非常重要的概念,它在不同情况下会指向不同的对象或值。在本文中,我们将深入探讨 JavaScript 中 this 的各种情况,并思考如何将其应用于 JS加密中的一些有趣用途。 1. 全局上下文中的 this 在全局上下文中&#xff…

苹果cms大橙子vfed 5.0去授权完美破解主题模板

大橙模版算是在苹果 cms 众多主题里,较为亮眼的一款了,主题简洁,功能众多,非常的齐全。 今天分享的就是大橙 5.0 版本模板,自定义菜单输入下列代码使用主题设置和资源采集。 vfed 主题设置,/index.php/la…

docker系列(1) - docker环境篇

文章目录 1. docker环境1.1 docker安装1.2 阿里云镜像加速器1.2 docker管理工具(portainer)1.3 docker网络1.3.1 网络说明1.3.2 创建指定网关的网络 1. docker环境 1.1 docker安装 #CentOS 6 rpm -iUvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noar…

【深度学习】 Python 和 NumPy 系列教程(廿七):Matplotlib详解:3、多子图和布局:散点矩阵图(Scatter Matrix Plot)

目录 一、前言 二、实验环境 三、Matplotlib详解 1、2d绘图类型 2、3d绘图类型 3、多子图和布局 1. subplot()函数 2. subplots()函数 3. 散点矩阵图(Scatter Matrix Plot) 一、前言 Python是一种高级编程语言,由Guido van Rossum于…

upload-labs文件上传靶场实操

文章目录 1.Pass-012.Pass-023.Pass-034.Pass-045.Pass-056.Pass-067.Pass-078.Pass-089.Pass-0910.Pass-1011.Pass-1112.Pass-1213.Pass-1314.Pass-1415.Pass-1516.Pass-1617.Pass-1718.Pass-1819.Pass-1920.Pass-20 上传姿势总结: 1)改后缀名绕过 2)Content-Type绕…

合宙Air724UG LuatOS-Air LVGL API控件-图片(Gif)

图片(Gif) GIF图片显示,core版本号要>3211 示例代码 方法一 -- 创建GIF图片控件 glvgl.gif_create(lvgl.scr_act()) -- 设置显示的GIF图像 lvgl.gif_set_src(g,"/lua/test.gif") -- gif图片居中 lvgl.obj_align(g, nil, lvgl…

【AIGC】Stable Diffusion Prompt 每日一练0916

一、前言 1.1 写在前面 本文是一个系列,有点类似随笔,每天一次更新,重点就Stable Diffusion Prompt进行专项训练,本文是第022篇《Stable Diffusion Prompt 每日一练0916》。上一篇《Stable Diffusion Prompt 每日一练0915》 1.…