每日学习一个数据结构-红黑树

文章目录

    • 什么是红黑树?
      • 示意图
      • 红黑树的特点
      • 红黑树的节点结构
      • 插入和删除操作
        • 旋转操作
        • 重新着色
      • 红黑树的应用
    • 树的构造过程
      • 插入新节点
        • 自平衡调整策略
      • 示例
    • 查询过程

什么是红黑树?

红黑树(Red-Black Tree)是一种自平衡的二叉查找树(Binary Search Tree, BST)。红黑树的设计目的是为了在插入和删除操作期间保持树的平衡,从而确保操作的时间复杂度为 O(log n),其中 n 是树中的节点数量。这种平衡有助于在最坏情况下也保持良好的性能表现。

示意图

红黑树

红黑树的特点

红黑树具有以下五个性质,这些性质确保了红黑树的自平衡性:

  1. 每个节点要么是红色,要么是黑色
  2. 根节点是黑色
  3. 所有叶子节点(NIL 节点,空节点)都是黑色
  4. 如果一个节点是红色的,则它的两个子节点必须是黑色的(即,红色节点不能连续出现,或者说红色节点的孩子必须是黑色)。
  5. 任意节点到其每个叶子节点的所有路径上包含相同数目的黑色节点(这被称为“黑色高度”)。

红黑树的节点结构

通常情况下,红黑树的节点除了包含关键字、左子树指针、右子树指针和父节点指针之外,还会包含一个颜色属性(红色或黑色)。这里的“红色”和“黑色”并不是真正的颜色,而是逻辑标记,用来帮助算法执行自平衡操作。

插入和删除操作

在红黑树中插入或删除节点时,可能会破坏上述的一些性质。因此,在插入或删除操作之后,需要进行一系列的旋转(rotation)和重新着色(recoloring)操作,以恢复红黑树的性质。

旋转操作

旋转操作分为两种:左旋(Left Rotation)和右旋(Right Rotation)。这两种操作可以改变树的形状,但不会改变树的排序顺序。

  • 左旋:对于一个节点 x,其右孩子 y 成为新的根节点,x 成为 y 的左子树。
  • 右旋:对于一个节点 y,其左孩子 x 成为新的根节点,y 成为 x 的右子树。
重新着色

重新着色是指改变节点的颜色以满足红黑树的性质。

红黑树的应用

红黑树因其优良的性能和相对简单的自平衡机制,在多种场景下得到广泛应用,尤其是在计算机科学领域,如:

  • 关联数组:在 C++ STL 中的 std::map 和 std::set,以及 Java 的 TreeMap 和 TreeSet,都使用了红黑树作为底层实现。
  • 数据库管理系统:一些数据库管理系统使用红黑树来组织索引数据。
  • 操作系统调度器:一些操作系统中的进程调度算法也使用红黑树来维护进程队列。

红黑树的优点在于它能够在 O(log n) 时间内完成查找、插入和删除操作,同时保持较好的空间效率。因此,它成为许多高效数据结构和算法的基础之一。

树的构造过程

红黑树的构造过程通常涉及插入新节点、删除节点以及必要的自平衡调整。构造过程的关键是在插入或删除节点后,保持红黑树的五个性质不变。下面是红黑树插入新节点的具体步骤及其自平衡调整过程。

插入新节点

  1. 插入操作

    • 新节点总是以红色插入。这是因为红色节点意味着其父节点是黑色,这样插入一个红色节点不会立即违反红黑树的性质。
    • 新节点插入到正确的位置,就像在普通的二叉查找树中一样。具体来说,新节点插入到叶节点的位置(此时的叶节点是指树中没有子节点的节点)。
  2. 修复插入后的不平衡

    • 插入新节点后,可能会导致红黑树的性质被破坏。特别是性质 4(红色节点不能有红色子节点)可能会被破坏。因此,需要进行一系列调整来恢复红黑树的性质。
    • 根据插入节点的位置以及其父节点和叔叔节点(如果有)的颜色,采取不同的调整策略。
自平衡调整策略

调整策略主要包括以下几种情况:

  1. Case 1: 新节点是根节点

    • 如果新插入的节点成为了树的根节点,那么只需简单地将新节点的颜色改为黑色即可。
  2. Case 2: 叔叔节点是红色

    • 如果新节点的叔叔节点是红色,那么可以将新节点的父节点和叔叔节点都设为黑色,而祖父节点设为红色。
    • 然后,将祖父节点设为当前节点,继续向上调整。
  3. Case 3: 叔叔节点是黑色(或不存在)

    • 如果新节点的叔叔节点是黑色或不存在(即新节点的父节点是祖父节点的唯一子节点),则需要进行旋转和重新着色操作来恢复红黑树的性质。

    这种情况又分为几种子情况:

    • Case 3a: 新节点是其父节点的右子节点,且父节点是祖父节点的左子节点

      • 执行左旋操作,将新节点的父节点变为当前节点,并进行 Case 3b 的检查。
    • Case 3b: 新节点是其父节点的左子节点,且父节点是祖父节点的左子节点

      • 将新节点的父节点设为黑色,祖父节点设为红色。
      • 对祖父节点执行右旋操作。
    • Case 3c: 新节点是其父节点的左子节点,且父节点是祖父节点的右子节点

      • 执行右旋操作,将新节点的父节点变为当前节点,并进行 Case 3d 的检查。
    • Case 3d: 新节点是其父节点的右子节点,且父节点是祖父节点的右子节点

      • 将新节点的父节点设为黑色,祖父节点设为红色。
      • 对祖父节点执行左旋操作。

示例

假设我们要在一个空的红黑树中依次插入节点 10、20、30 和 40。

  1. 插入节点 10

    • 作为第一个节点,插入后设为黑色。
  2. 插入节点 20

    • 作为右子节点插入,设为红色。
    • 无需调整,因为只有一个节点,没有违反红黑树性质。
  3. 插入节点 30

    • 作为 20 的右子节点插入,设为红色。
    • 此时,20 和 30 都是红色,违反性质 4,需要调整。
    • 由于 10(祖父节点)是黑色,且 20(父节点)的兄弟节点为空,故采用 Case 3b 的处理方式。
    • 将 20 设为黑色,10 设为红色,并对 10 执行右旋。
  4. 插入节点 40

    • 作为 30 的右子节点插入,设为红色。
    • 此时,30 和 40 都是红色,需要调整。
    • 由于 20(祖父节点)是黑色,且 30(父节点)的兄弟节点为空,故采用 Case 3d 的处理方式。
    • 将 30 设为黑色,20 设为红色,并对 20 执行左旋。

通过以上步骤,可以逐步构建出一棵符合红黑树性质的树。每次插入后,都需要检查并调整以确保树的性质保持不变。

查询过程

红黑树是一种自平衡的二叉查找树,它保证了在最坏的情况下,任何查找、插入或删除操作的时间复杂度都是 O(log n)。下面概述了红黑树的查询过程:

  1. 从根节点开始

    • 查询开始于树的根节点。
  2. 比较键值

    • 将要查找的键值与当前节点的键值进行比较。
      • 如果两者相等,则找到了所查找的键值,查询结束。
      • 如果查找的键值小于当前节点的键值,则继续在当前节点的左子树中查找。
      • 如果查找的键值大于当前节点的键值,则继续在当前节点的右子树中查找。
  3. 递归搜索

    • 根据上述比较结果,选择相应的子树,并在该子树中重复步骤2的操作。
  4. 到达叶子节点

    • 如果一直到达叶子节点(即当前节点为空),且没有找到目标键值,则说明该键值不在树中,查询失败。
  5. 返回结果

    • 如果在树中找到了目标键值,返回相应的节点或值。
    • 如果没有找到目标键值,返回一个指示未找到的标志或特定值。

红黑树的查询过程与普通二叉查找树非常相似,但是由于红黑树的自平衡特性,可以确保树的高度始终保持在较低水平,从而提高了最坏情况下的性能。注意,在实际的查询过程中,不会涉及到红黑树的颜色属性,因为查询仅关心键值的比较,而不涉及树的平衡性质。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

小程序体验版无法正常请求接口,开启 调试可以正常请求

在本地开发工具可以正常访问小程序,上传代码后打开体验版,界面无法请求接口,手机小程序打开调试模式可以正常访问。这可以查看下小程序后台是否设置了服务器域名以及业务域名 然后查看小程序开发工具 - 详情 - 项目配置 重新上传代码&#xf…

基于vue框架的宠物寻回小程序8g7el(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能:发布人,宠物分类,宠物信息,接取人,接取信息,完成信息 开题报告内容 基于Vue框架的宠物寻回小程序开题报告 一、研究背景与意义 随着城市化进程的加快和人们生活水平的提高,宠物已成为许多家庭不可或缺的一员。它们不仅为生…

yolov5测试代码

一般源码的测试代码涉及很多文件,因项目需要写一个独立测试的代码。传入的是字典 import time import cv2 import os import numpy as np import torch from modules.detec.models.common import DetectMultiBackend from modules.detec.utils.dataloaders import …

工业交换机如何保证数据的访问安全

在现代工业自动化环境中,工业交换机作为关键的网络设备,扮演着数据传输和信息交互的重要角色。为了确保数据的访问安全,工业交换机不仅具备高效的转发性能,还集成了多层次的安全防护机制,以抵御各种潜在的网络威胁。 首…

输电线螺栓销钉缺失检测数据集

输电线螺栓销钉缺失检测数据集共1209张。标注文件为YOLO适用的txt格式以及VOC格式。可以直接用于模型训练。 类别:缺失和不缺失 包含yolov7tiny训练验证结果以及权重文件和数据集。 数据集亮点: 丰富的图像资源: 本数据集包含1209张高质量…

PHP及Java等其他语言转Go时选择GoFly快速快速开发框架指南

概要 经过一年多的发展GoFly快速开发框架已被一千多家科技企业或开发者用于项目开发,他的简单易学得到其他语言转Go首选框架。且企业版的发展为GoFly社区提供资金,这使得GoFly快速框架得到良好的发展,GoFly技术团队加大投入反哺科技企业和开…

268页PPT大型集团智慧工厂信息化顶层架构设计(2024版)

智能制造装备是高端制造业的关键,通过整合智能传感、控制、AI等技术,具备了信息感知、分析规划等智能化功能,能显著提升加工质量、效率和降低成本。该装备是先进制造、信息、智能技术的深度融合。其原理主要包括物联网集成、大数据分析与人工…

Windows Server2016多用户登录破解

使用场景 很多时候,公司开发和测试运维会同时登录同一台windows服务器进行查询、更新、维护等操作,本文就来介绍一下Windows2016配置多人远程桌面登录实现,感兴趣的可以了解一下。 操作流程 (1)首先桌面需要安装远程…

详解x86汇编指令:test edx, edx

前言 有不少新手在学习汇编指令的时候可能会被网上一些人误导(很显然我就被误导了),认为test与cmp指令相同,都是在比较两个值是否相同的,那么来看这两个指令: test edx,edx jne 0040BCA3jne 指令为不等于0…

18.DHT11编程案例

温湿度传感器 产品概述 DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,应用领域:暖通 空调;汽车;消费品;气象站;湿度调节器;除湿器;家电;医疗…

技术美术百人计划 | 《4.1 Bloom算法》笔记

1. Bloom算法介绍 1.1. Bloom效果 实际拍摄照片与游戏画面Bloom效果对比,Bloom模拟了真实世界图片的效果 Bloom流程图 1.2. 前置知识:HDR和LDR,高斯模糊 1.2.1. HDR和LDR LDR颜色范围太少,精度不够,往往会存在颜色精…

Prometheus 上手指南

文章目录 Prometheus 相关概念Prometheus 的特点Prometheus 架构数据模型 Datemode使用场景 指标类型 Metric type适用场景 作业和实例 Jobs and instances使用场景 Prometheus 安装Prometheus 配置prometheusalertmanager Grafana 可视化Grafana 安装Grafana 配置选项Grafana …

微信小程序开发第五课

一 vant-app # https://vant-contrib.gitee.io/vant-weapp/#/home1.1 集成步骤 # 0 必须使用专门为小程序提供的npm包,通常好多包用不了,比如第三方包用了dom,小程序没有 https://developers.weixin.qq.com/miniprogram/dev/devtools/npm.h…

MATLAB画图,曲线图如何绘制美观,曲线图10种美化方法

曲线图是比较常用的图形,本文以二维曲线图为例,展示曲线的图的不同美化方法,如图1所示,是一个标准的曲线图,横坐标为x,纵坐标为y, 图1 标准曲线图 调整方法1 首先可以通过改变线的颜色,不同…

使用API有效率地管理Dynadot域名,为域名进行隐私保护设置

前言 Dynadot是通过ICANN认证的域名注册商,自2002年成立以来,服务于全球108个国家和地区的客户,为数以万计的客户提供简洁,优惠,安全的域名注册以及管理服务。 Dynadot平台操作教程索引(包括域名邮箱&…

js中的 赋值 浅拷贝 和 深拷贝 详细解读

js数据类型主要分基本数据类型和引用数据类型。前者包括Number,String等,后者主要是Object,因此以下会针对不同的数据类型来分析,需要的朋友可以参考一下 基本数据类型(Primary Data Types): String(字符串) Number&…

【4】AT32F437 OpenHarmony轻量系统移植教程(1)

开源地址:https://gitee.com/AT32437_OpenHarmony 1.学习本文档的意义 1.学习移植OpenHarmony轻量系统到AT32全系列mcu上,本文档移植的具体型号为AT32F437ZMT7 2.学习OpenHarmony轻量系统开发 2.移植前的准备工作 1.移植之前必须要先熟悉AT-START-F…

C:字符串函数(完)-学习笔记

目录 前言: 1、strstr 1.1 strstr的使用 4.2 strstr的模拟实现 5、strtok 5.1 strtok函数的介绍 5.2 strtok函数的使用 6、strerror 前言: 这篇文章将介绍strstr函数,strtok函数,strerror函数 1、strstr 1.1 strstr的使用…

Android JetPack系列之——Navigation

[转] 由于Android的开源性,在开始的几年呈现出了百家齐放的盛况,层出不穷的API和以及官方的API各自大放异彩,在丰富了android生态的同时也带来了一个很严重的问题,即android 的碎片化和规范化的问题。碎片化主要集中于国内的各大…

MYSQL解说

MySQL是一个流行的开源关系型数据库管理系统(RDBMS),广泛用于网站和应用程序的后端数据存储。 MySQL的基础知识: 1. 数据库和表 数据库(Database):存储数据的逻辑容器。表(Table&…