红黑树插入的实现

2023-09-19 14:16:09

红黑树:

1.概念:

红黑树的性质:

红黑树的插入操作:

其前面的插入和二叉搜索树的一模一样,只是后面需要判断是否满足红黑树的性质:

具体分为三种情况:

1.uncle节点存在且为红色的:

对应如图:

这种情况只需要将parent和uncle节点都弄成黑色,对应的grandparent节点弄成黑色

接下来又会分为三种情况:

  • 1.如果对应的grandparent就是根节点,那么只需要将根节点再弄成黑色即可

  • 2.如果对应的grandparent的父亲是黑色节点,则直接结束即可

  • 3.如果对应的grandparent的父亲是红色节点,则需要将cur = grandparent,再次进行循环

2.uncle节点存在且为黑:

第一种情况:

对应的这种情况,对应的需要旋转+变色:

可以看出左边的长度长,所以进行右旋:

这里的右旋与AVL数的完全相同:

右旋之后就得到下图:

再将parent变为黑,grandparent变为红

是满足红黑树条件的。

第二种情况:

对应这种情况需要先想左旋在向右旋:

同样与AVL树完全相同:

左旋是以p为节点,右旋的时候以g为节点

再将cur变为黑,grandparent变为红

对应的结果如下:

还有另外两种情况对应的是 parent == grandparent -> right

这又会分为两种情况,

分别进行左旋或者右左双旋,再将parent/cur变为黑,grandparent变为红即可。

3.uncle不存在:

对应的情况如下:

第一种情况:

只需要进行一次右旋再将parent变为黑,grandparent变为红即可:

第二种情况:

需要进行左右双旋,再将再将cur变为黑,grandparent变为红:

还有另外两种情况对应的是 parent == grandparent -> right

这又会分为两种情况,

分别进行左旋或者右左双旋,再将parent/cur变为黑,grandparent变为红即可。

通过分析之后,发现uncle节点存在且为黑和uncle节点不存在可以和为一种情况:

所以,一共有两大种情况:

1.uncle存在且为红:进行变色+循环即可

2.uncle存在且为黑/uncle不存在:进行旋转+变色即可

这里的代码其实不是关键。关键是思想

对应的代码如下:

更多推荐

如何使用jenkins、ant、selenium、testng搭建自动化测试框架

如果在你的理解中自动化测试就是在eclipse里面讲webdriver的包引入,然后写一些测试脚本,这就是你所说的自动化测试,其实这个还不能算是真正的自动化测试,你见过每次需要运行的时候还需要打开eclipse然后去选择运行文件吗?没有吧!应为那样真的是很low的!下面说一下经理的两种自动化测试:一、将脚本写好,放在服

【Redis】redis实现限流

【Redis】redis实现限流【一】固定窗口【二】滑动窗口【三】令牌桶【四】深入分析Zset的数据结构【一】固定窗口所谓固定窗口限流就是时间窗口的起始和节数时间是固定的,在固定时间段内允许要求的请求数量访问,超过这个数量就会拒绝;当固定时间段结束后,再重新开始下一个时间段进行计数。我们可以根据当前的时间,以分钟为时间

PHP8中的构造方法和析构方法-PHP8知识详解

今日分享的内容是php8中的构造方法和析构方法,我们把构造方法和析构方法这两个方法分开来讲:1、构造方法构造方法存在于每个声明的类中,主要作用是执行一些初始化任务。如果类中没有直接声明构造方法,那么类会默认地生成一个没有参数且内存为空的构造方法。在PHP8中,构造方法的方法名称必须是两个下划线开头的,即“__const

Java多线程编程-线程间协作wait/notify

前言:本文是基于《Java多线程编程实战指南》第五章个人理解,源码是摘抄作者的源码,源码会加上自己的理解。等待与通知:wait/notify单线程的变成中,如果程序需要在满足一定条件间下操作一个目标动作,就需要if语句,而在多线程中处理这种情况,保护条件可能只是暂时的,稍后其他线程可能更新了保护条件设计共享变量而使其成

如何通过快解析测试接口内外网?本地内网ip让外网访问连接

接口调试测试是网络技术员经常工作内容之一。如在公司内部api项目webserver测试,在公司内办公室个人电脑是正常用内网IP访问连接测试的,但在外网电脑需要远程测试时需要怎么测试呢?这里提供一种内网地址让外网访问的通用方法:快解析内网映射。内网地址在外网访问的原理主要是通过快解析软件方式,将本地内网地址转换成外网可以

adb操作及常用命令

问题:nodevices/emulatorsfound:adbdevices没有连接的设备解决方案:大概率是因为usb调试功能没有打开,可以查看手机设备是否开启usb调试功能Android若未开启,可通过设置-关于手机,连续点击版本号7次,打开开发者模式后开启usb调试常用命令汇总查看连接计算机的设备:adbdevic

基于SpringBoot+Vue的旅游管理系统

目录前言一、技术栈二、系统功能介绍登录界面管理员功能模块用户功能模块三、核心代码1、登录模块2、文件上传模块3、代码封装前言随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势,旅游网站当然也不能排除在外,随着旅游网站的不断成熟,它彻底改变了过去传统的旅游网站方式,不仅使旅游管理难度变

WebGIS开发教程:mapbox和Cesium的区别

Mapbox和Cesium都是WebGIS领域中的开源⼯具,它们都提供了丰富的地图显示和数据可视化功能,而且都能实现三维可视化开发,但是他们在某些方面确实有一定区别。1.定位不同:Mapbox更注重静态地图和动态地图的制作和展示,特别是在移动设备和Web应用程序中的实现方面,提供了强⼤的地图渲染引擎和⼯具,能够快速构建

华为数字能源,开启超充新纪元

编辑:阿冒设计:沐由在过去很长的一段时间里,国内某著名品牌火锅是从来不担心获客的。顶峰时期,该品牌每年服务超过1.6亿人次的顾客,翻台率达到了5次/天,几乎创下了餐饮界的最高翻台率。翻台率是餐饮企业最为重要的指标之一,就如同当前风风火火的充电站。任谁都能明白无误地看出,伴随着国内新能源汽车产业规模的不断扩大,投资充电站

大型架构设计的演进之路

Java全能学习+面试指南:https://javaxiaobear.cn今天我们一起看看大型互联网系统架构的演进之路,主要包含三部分内容。第一部分是大型互联网系统的特点,分析大型互联网有哪些特点和挑战,它们是现在一些技术和架构方案产生的原因。第二部分是系统处理能力提升的两种途径,提供了两种面对挑战的解决思路。第三部分

Java-day14(多线程)

多线程0.基本概念程序:为完成特定任务,用某种编程语言编写的一组指令的集合(静态)进程:程序的一次执行过程,或正在执行的一个程序(动态过程)线程:程序内部的一条执行路径,若某个程序支持同一时间执行多个线程,即支持多线程1.多线程的创建和使用继承Thread类创建多线程一个线程只能执行一次start()不能通过Threa

热文推荐