数据结构 之 红黑树

手撕红黑树——C++高阶数据结构详解 带你一命通关红黑树 十五分钟手撕数据结构原理 阅读详情

一、简述

红黑树是一种特殊的二叉树,并且是优秀的自平衡查找树,下图为红黑树的示例:

红黑树具有以下几大特性:

1、根节点为黑色。

2、所有节点都是黑色或红色。

3、所有叶子节点(Null)都是黑色。

4、红色节点的子节点一定是黑色的。

5、任意一个节点到其叶子节点的所有路径上的黑色节点数量相同(黑色完美平衡二叉树)。

以上的五大特定也是维持红黑树结构的基本规则,但是明白了这些规则,不代表我们就明白了红黑树的设计原理及规则维持算法。

在我们日常的工作中多多少少都会接触到红黑树,特别是JDK1.8之后hashmap的底层采用了红黑树机构,接下来的博文中我们会一点点弄明白以下几个问题,也是笔者在学习之前不明白的两个问题:

1、红黑树为什么要维持自平衡、自平衡的好处是什么?

2、什么是左旋,右旋,变色?

3、什么条件下需要进行左旋、右旋、变色?

二、红黑树的自平衡

根据上一节红黑树特性第5点可以知道,红黑树是一颗黑色完美平衡二叉树,红黑树从根节点到叶子结点的最长路径不会超过最短路径的2倍;

这就保证了红黑树优秀的查找性能,其查找的时间复杂度为O(logn);

当插入或删除阶段操作过程中,会破坏此平衡结构,当平衡遭到破坏,程序会进行一系列操作来重新维持平衡,这一过程就是自平衡;这一系列操作就是左旋、右旋、变色。 

1、左旋:

对当前节点进行左旋:当前节点的右子节点变为父节点,原右子节点的左子节点变为当前节点的右子节点,如图演示(对150节点进行左旋):

上图对150节点左旋:

  1. 把150节点的右子节点170变为其父节点(170变为150的父节点)。
  2. 把150节点的原右子节点170的左子节点160变为其右子节点(160变为150的右子节点)。

注意:

    • 图中只是示意图,在第一步之后,170节点并没有三个指向其他节点的指针,这里只是为了理解起来更清晰
    • 图中只是进行左旋,还没有涉及变色问题,所以会看到父节点与子节点同色问题。
    • 左旋操作涉及到的节点只是当前节点的右子节点和右子节点的左子节点两个节点,其他节点不变。

2、右旋:

对当前节点进行右旋:当前节点的左子节点变为父节点,原左子节点的右子节点变为当前节点的左子节点,如图演示(对150节点进行右旋):

上图对150节点进行右旋:

  1. 把150节点的左子节点130变为其父节点(130变为150的父节点)。
  2. 把150节点的原左子节点130的右子节点null节点变为其左子节点(130的原右子节点null变为150的左子节点)。

 注意:

    • 图中只是示意图,在第一步之后,130节点并没有三个指向其他节点的指针,这里只是为了理解起来更清晰
    • 图中只是进行左旋,还没有涉及变色问题,所以会看到父节点与子节点同色问题。
    • 右旋操作涉及到的节点只是当前节点的左子节点和左子节点的右子节点两个节点,其他节点不变。

3、变色:

节点的变色:就是节点由红色变成黑色或有黑色变成红色。

而在实际的维持自平衡的过程中变色过程有可能是一个连锁反应,而破坏平衡结果的操作有插入和删除。 

三、节点的插入

红黑树新节点的插入有可能会破坏现有的平衡结构,所以就需要进行节点的变色、左旋或者右旋操作来保持红黑树的平衡;但插入操作的情况区分比较多,这也正是红黑树自平衡结构不容易理解的地方之一;

下图就是插入的所有情况,接下来会有

【数据结构】红黑树 红黑树的概念、红黑树的性质、红黑树结点的定义、红黑树的增删查改、红黑树的验证、红黑树与AVL树的比较 阅读详情

相关推荐

数据结构 - 红黑树

数据结构 - 红黑树 - 面试常问知识点 数据结构是面试中必定考查的知识点,面试者需要掌握几种经典的数据结构:线性表(数组、链表)、栈与队列、树(二叉树、二叉查找树、平衡二叉树、红黑树)、图。 本文主要介绍树中的常见的红黑树数据结构。包括 简介 应用 左旋和右旋 简介 R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种特殊的二叉查找树。红黑树的

从零开始 3411

【数据结构进阶】手撕红黑树

红黑树的介绍,以及底层代码逻辑和实现。刚刚接触编程的时候就听说有的大厂HR会让手撕红黑树。心中一直对这个数据结构保持着敬畏和向往,今天在将其撕出来后,用本篇博客加以记录,望周知。红黑树的结点包含四个成员变量,模板类型T:可以存储K或者pair类型,便于后期封装;三个指针:分别为指向左孩子结点的指针,指向右孩子结点的指针,指向父结点的指针;最后变量_col:枚举类型,可以存RED和BLACK。

2303_79329831的博客 1815

Xilinx Chip2Chip IP核实战:Aurora PHY通信配置与仿真避坑指南

本文深入解析Xilinx Chip2Chip IP核与Aurora PHY的通信配置与仿真优化,提供实战避坑指南。通过AXI协议转换桥实现FPGA间高速数据传输,详细讲解Aurora PHY参数设置、仿真加速技巧及常见问题解决方案,帮助工程师快速部署稳定高效的芯片间通信系统。

g5h6i7j的博客 1006

费斯托SPAN压力传感器的调试

本体为压力传感器,检测气压大小,通过设置参数,在上电上气时对气压进行判断,进而通过自身逻辑的判断,控制传感器的通断,进而控制机械部位的工作与运行;通电之后为如下图所示的样子有三个按键ABEdit键(编辑键、确认键)两步即可轻松连接。

大小曲奇的博客 1万+

STM32开发实战--解决STM32CubeMX生成代码时钟初始化卡死问题

本文详细分析了STM32CubeMX生成代码在时钟初始化阶段卡死的问题,提供了多种解决方案,包括简单修改和稳健的等待机制。通过深入探讨HAL库的时钟初始化陷阱及硬件层面的根本原因,帮助开发者快速定位并解决STM32开发中的常见问题。

weixin_26965807的博客 441

当版图同学只给GDS文件时,我是这样用Calibre PEX和Cadence做后仿真的(保姆级避坑)

本文详细介绍了在模拟IC设计中,当仅获得GDS文件时,如何利用Calibre PEX和Cadence进行高效后仿真的完整流程。涵盖从寄生参数提取到Spectre模型创建的实战技巧,特别针对版本兼容性、文件独立性和参数可调性等常见问题提供解决方案,帮助工程师规避协作中的典型陷阱。

weixin_42556197的博客 243

GEE:连续变化检测 CCDC 提取断点信息(干扰时间、干扰幅度、干扰次数)

本文将介绍在 Google Earth Engine (GEE) 平台上连续变化检测与分类(Continuous Change Detection and Classification, CCDC)提取扰动时间、干扰幅度、干扰次数信息,并下载到本地的代码。

养乐多的博客 1945

时间门控拉曼进展

拉曼光谱就像是用光给分子拍“指纹照”,通过激光照射样品,散射光会揭示样品的分子结构。但问题来了,样品有时会发荧光,就像拍照时闪光灯太亮,把指纹照模糊了。时间门控拉曼光谱技术就像加了个“快门”,只在拉曼信号出现的那一瞬间开门,把慢吞吞的荧光挡在门外,这样就能拍到清晰的“指纹”。

qq_53529450的博客 537

40、5G NR射频要求解析

本文详细解析了5G NR射频相关要求,包括参考灵敏度与动态范围的定义、接收机对干扰信号的抗扰性要求(如阻塞、邻道选择性等)、辐射射频要求在FR1和FR2频段的差异,以及多标准无线电基站(MSR)的发展及其对射频要求的影响。内容涵盖测试模型、干扰场景、具体指标和实现挑战,为理解和应用5G NR射频规范提供了全面指导。

qsc901234的博客 245

《深入浅出多模态》(四):多模态经典模型CLIP

本文为《深入浅出多模态》系列多模态经典模型CLIP,首先从整体介绍多模态模型发展,对其中经典CLIP模型进行详述,从具体论文、数据集、代码、模型结构、结果等角度分析,本专栏适合从事多模态小白及爱好者学习,欢迎大家关注,如有侵权请联系删除!

专注大数据与人工智能技术分享,欢迎私信加群互相学习! 1045

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

上一篇: Spring, MyBatis 多数据源的配置和管理
下一篇: Spring Cloud:统一异常处理
奇迹摘星w
博客等级 码龄6年 1844粉丝 189原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值