红黑树详解

红黑树的概念与性质

 前置知识

在学习红黑树之前,最好有二叉查找树和AVL树的基础,因为红黑树本质就是一种特殊的二叉查找树,而红黑树的操作中需要用到AVL树中旋转的相关知识。至于二叉查找树和AVL树,可以参考如下两篇博客:

二叉查找树:二叉查找树-CSDN博客

AVL树:AVL树详解_avl tree-CS  DN博客


红黑树是一种特殊的二叉查找树,顾名思义,红黑树的一个特性就是每个节点都有一个颜色特征,或为红或为黑。红黑树可以通过一系列的限制规则保证最长路径小于最短路径的两边,也就是说,红黑树的每一条路径长度的范围为[N, 2N],其中N为最短路径长度。

与AVL树不同的是,红黑树并不是严格意义上的平衡二叉树,降低了插入和旋转的次数,所以在经常进行增删的结构中性能比AVL树更优。

红黑树是通过如下5条性质/规则来维护的:

  1. 每个结点不是红色就是黑色
  2. 根节点必须是黑色的
  3. 红色节点的孩子结点只能是黑色的,即路径上不能出现两个连续的红节点
  4. 从任一节点到其每个叶子的所有路径,要包含相同数目的黑色节点
  5. 所有的叶子结点都是黑结点

注意,由于翻译的问题,这里的叶子节点实际上指的其实是NIL节点(空节点)。所以,第5条并不算是一条规则,而是一个性质的说明。

那么为什么说这几条性质就保证了最长路径不会大于最短路径的二倍呢?首先,根节点一定是黑的就保证了每条路径的开始都是一个黑色节点。不能出现连续的红节点而且每条路径的黑色结点数量要保持一致,这种的话最短路径的情况就是整条路径都为黑色的情况,而最长路径的情况就是一黑后面紧跟着一红结点。所以我们很容易应证,最长路径不会超过最短路径的二倍。

红黑树的插入

红黑树本质上就是一种特殊的二叉查找树,所以大纲上我们依旧是按照二叉查找树的方式来插入。但是特别的,红黑树还维护了结点的颜色这一特性,所以我们还需要额外维护结点的颜色已经遵循上述的条规则/性质。

首先我们要思考,插入新结点时,是将其初始化为红色还是黑色。我们知道红黑树要控制每条路径的黑色结点相同,所以为了安全起见,一般是插入节点都默认初始化为红色节点。特别的,红黑树还要保证根节点为黑色,所以我们还需要对根节点的情况特殊处理。也就是说,除了根节点的情况外,新插入的结点都是统一初始化为红色,后续就根据具体情况具体调整了。

那么新插入结点默认为红结点,就必然会出现插入之后连续两个红色结点的情况,那么我们可以将插入之后出现连续红色结点的各种情况分为两大类来说:

首先我们规定,cur为当前新插入的节点,p为父节点,g为祖父节点,u为叔叔节点。

  • 情况1:cur为红,p为红,u存在且为红,g为黑

这里需要解释一下,cur为新插入节点,如果p是红的,那么根据红黑树的性质,g一定是黑的。这种叔叔节点存在且为红的情况比较好处理,只需要让父亲节点p和叔叔节点u的颜色置黑,g节点置黑即可。

首先,把p和u置黑是因为不能出现连续的红色节点。而把g置红是因为g并不一定就是根节点,所以为了不影响本条路径的黑色节点的数量,是需要将p置红的。那么如果g真的为根节点的话不就又与性质冲突了吗?所以我们需要特殊情况特殊处理,一般来说前面照常操作,最后之间暴力将根节点颜色设置为黑色是一种较为简便好理解的方式。

我们要知道,红黑树节点调整要在保证不改变路径上黑色节点数量的情况下进行调整,所以当叔叔节点存在且为红的时候,我们就可以通过将叔叔节点置黑,使得在保证路径上黑色节点数量不变的前提下,调整两个连续的红色节点。

  • 情况2:cur为红,p为红,g为黑,u不存在/u存在且为黑

那么当叔叔节点为黑色呢?这时我们就无法直接通过简单颜色来进行调整了,此时就需要用到AVL树中提到的4个旋转了。根据p和cur的位置,共有四种旋转的情况。不过由于双旋与单旋之后原来g位置的节点可能为cur也可能为p,所以我们这时就不能单纯的将cur置红或置黑。而是将旋转之后原g位置的节点置黑,将其两个子节点置红,叔叔节点一直是黑的或者空,所以不用对其处理。

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

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

相关文章

Matplotlib图形注释_Python数据分析与可视化

Matplotlib图形注释 添加注释文字、坐标变换 有的时候单单使用图形无法完整清晰的表达我们的信息,我们还需要进行文字进行注释,所以matplotlib提供了文字、箭头等注释可以突出图形中重点信息。 添加注释 为了使我们的可视化图形让人更加容易理解&#…

长度最小的子数组

给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。 示例 1: 输入&#x…

MySQL 有多个普通索引时会取哪一个索引?

我们都知道MySQL在查询时底层会进行索引的优化,假设有两个普通索引,且where 后面也根据这两个普通索引查询数据,那么执行查询语句时会使用到那个索引? 为了方便演示,新建users表,新建idx_name、idx_city这两…

前端vue导出PPT,使用pptxgen.js

前言 公司新需求需要导出ppt给业务用,查阅资料后发现也挺简单的,记录一下。 如有不懂的可以留言!!! 1.安装包 npm install pptxgenjs --save2.引入包 在需要使用的文件中引入 import Pptxgenfrom "pptxgenjs&…

Oracle研学-介绍及安装

一 ORACLE数据库特点: 支持多用户,大事务量的事务处理数据安全性和完整性控制支持分布式数据处理可移植性(跨平台,linux转Windows) 二 ORACLE体系结构 数据库:oracle是一个全局数据库,一个数据库可以有多个实例,每个…

nodejs+vue+python+PHP+微信小程序-留学信息查询系统的设计与实现-安卓-计算机毕业设计

1、用户模块: 1)登录:用户注册登录账号。 2)留学查询模块:查询学校的入学申请条件、申请日期、政策变动等。 3)院校排名:查询国外各院校的实力排名。 4)测试功能:通过入学…

python-选择排序

选择排序是一种简单直观的排序算法,它的基本思想是每一轮选择未排序部分的最小元素,然后将其放到已排序部分的末尾。这个过程持续进行,直到整个数组排序完成。(重点:通过位置找元素) 以下是选择排序的详细步骤和 Python 实现&…

HarmonyOS应用开发实战—登录页面【ArkTS】

文章目录 本页面实战效果预览图一.HarmonyOS应用开发1.1HarmonyOS 详解1.2 ArkTS详解二.HarmonyOS应用开发实战—登录页面【ArkTS】2.1 ArkTS页面源码2.2 代码解析2.3 心得本页面实战效果预览图 一.HarmonyOS应用开发 1.1HarmonyOS 详解 HarmonyOS(鸿蒙操作系统)是华为公司…

js粒子效果(一)

效果: 代码: <!doctype html> <html> <head><meta charset"utf-8"><title>HTML5鼠标经过粒子散开动画特效</title><style>html, body {position: absolute;overflow: hidden;margin: 0;padding: 0;width: 100%;height: 1…

DELL MD3600F存储重置管理软件密码

注意&#xff1a;密码清除可能会导致业务秒断&#xff0c;建议非业务时间操作 针对一台控制器操作即可&#xff0c;另一控制器会同步操作 重置后密码为空&#xff01; 需求&#xff1a;重置存储管理软件密码 管理软件中分配物理磁盘时提示输入密码(类似是否了解风险确认操作的提…

io.lettuce.core.RedisCommandExecutionException

io.lettuce.core.RedisCommandExecutionException: ERR invalid password ERR invalid password-CSDN博客 io.lettuce.core.RedisCommandExecutionException /** Copyright 2011-2022 the original author or authors.** Licensed under the Apache License, Version 2.0 (the…

Rust UI开发(一):使用iced构建UI时,如何在界面显示中文字符

注&#xff1a;此文适合于对rust有一些了解的朋友 iced是一个跨平台的GUI库&#xff0c;用于为rust语言程序构建UI界面。 iced的基本逻辑是&#xff1a; UI交互产生消息message&#xff0c;message传递给后台的update&#xff0c;在这个函数中编写逻辑&#xff0c;然后通过…

2023-11-24--oracle--实验--[Merge 语句]

oracle--实验---Merge语句 1.认知Merge 语句 • merge 语句是 sql 语句的一种。在 SQL server 、 Oracle 数据库中可用&#xff0c; MySQL 中不可用。 • merge 用来合并 update 和 insert 语句。目的&#xff1a;通过 merge 语句&#xff0c;根据一张表&#xff08; 原数据表…

AT360-6T GNSS 单频高精度授时模块特性参数

AT360-6T 模块具有高灵敏度、低功耗、低cost等优势&#xff0c;可以满足电力授时&#xff0c;通信授时等领域的应用。AT360-6T特点&#xff1a; 1.支持北斗二代/北斗三代信号 2.高精度授时 3.可靠性授时 实时高精度授时 AT360-6T 系列模块的授时秒脉冲抖动可以达到 10ns&am…

杰发科技AC7801——ADC软件触发的简单使用

前言 7801资料读起来不是很好理解&#xff0c;大概率是之前MTK的大佬写的。在此以简单的方式进行描述。我们做一个简单的规则组软件触发Demo。因为规则组通道只有一个数据寄存器&#xff0c;因此还需要用上DMA方式搬运数据到内存。 AC7801的ADC简介 7801的ADC是一种 12 位 逐…

洛谷P1157组合的输出 递归:我他又来辣

没没没没没没没错&#xff0c;这是一道简单的递归&#xff08;其实是深搜加回溯) 我不管&#xff0c;我说是递归就是递归。 上题干&#xff1a; 题目描述 排列与组合是常用的数学方法&#xff0c;其中组合就是从 n 个元素中抽出 r个元素&#xff08;不分顺序且 r≤n&#x…

大数据技术之数据安全与网络安全——CMS靶场实训

大数据技术之数据安全与网络安全——CMS靶场实训 在当今数字化时代&#xff0c;大数据技术的迅猛发展带来了前所未有的数据增长&#xff0c;同时也催生了对数据安全和网络安全的更为迫切的需求。本篇博客将聚焦于大数据技术背景下的数据安全与网络安全&#xff0c;并通过CMS&a…

C语言-指针讲解(3)

文章目录 1.字符指针变量1.1 字符指针变量类型是什么1.2字符指针变量的两种使用方法&#xff1a;1.3字符指针笔试题讲解1.3.1 代码解剖 2.数组指针变量2.1 什么是数组指针2.2 数组指针变量是什么&#xff1f;2.2.3 数组指针变量的举例 2.3数组指针和指针数组的区别是什么&#…

npm ERR! node-sass@4.13.0 postinstall: `node scripts/build.js`

npm ERR! node-sass4.13.0 postinstall: node scripts/build.js npm config set sass_binary_sitehttps://npm.taobao.org/mirrors/node-sass npm install npm run dev Microsoft Windows [版本 10.0.19045.2965] (c) Microsoft Corporation。保留所有权利。C:\Users\Administr…

4.操作系统常见面试题(2)

3.4 虚拟内存 直接使⽤物理内存会产⽣⼀些问题 1. 内存空间利⽤率的问题&#xff1a;各个进程对内存的使⽤会导致内存碎⽚化&#xff0c;当要⽤ malloc 分配⼀块很⼤的内存空间时&#xff0c;可能会出现虽然有⾜够多的空闲物理内存&#xff0c;却没有⾜够⼤的连续空闲内存这种…