红黑树原理及插入

article/2025/11/3 15:44:01

文章目录

  • 1、前言
  • 2、红黑树
    • 2.1、性质
    • 2.2、操作
      • 2.2.1、变色
      • 2.2.2、左旋
      • 2.2.3、右旋
      • 2.2.4、查找
      • 2.2.5、插入
    • 2.3、插入情景
      • 2.3.1、红黑树为空树
      • 2.3.2、插入结点的Key已存在
      • 2.3.3、插入结点的父结点为黑结点
      • 2.3.4、插入节点的父节点为红色
        • 2.3.4.1、叔叔结点存在并且为红结点
      • 2.3.5、叔叔结点不存在或为黑结点,并且插入结点的父亲结点是祖父结点的左子结点
        • 2.3.5.1、新插入节点,为其父节点的左子节点(LL红色情况)
        • 2.3.5.1、新插入节点,为其父节点的右子节点(LR红色情况)
      • 2.3.6、叔叔结点不存在或为黑结点,并且插入结点的父亲结点是祖父结点的右子结点
        • 2.3.6.1、新插入节点,为其父节点的右子节点(RR红色情况)
        • 2.3.6.2、新插入节点,为其父节点的左子节点(RL红色情况)
    • 2.4、案例演示
    • 2.5、总结

学习地址1、 学习地址2

1、前言

  1. 节点的深度:从根节点开始自顶向下逐层累加的。
  2. 节点的高度:从叶子结点开始自底向上逐层累加的。
  3. 前序遍历:根左右。
  4. 中序遍历:左根右。
  5. 后序遍历:左右根。
  6. 二叉搜索树删除有两个子结点的节点的时候,此时该节点应该找它右子树上最小的子结点。
  7. 当二叉搜索树只有单侧的子结点,那么查找的效率会从 O ( l o g N ) O(logN) O(logN)退化到 O ( N ) O(N) O(N)
  8. 解决:AVL树(每个节点的左子树和右子树的高度差小于等于1)。
  9. 虽然AVL树能够解决树退化成链表的问题,但是几乎在每插入一个节点之后,树都会进行左旋和右旋进行调整,使其再次成为一个符合要求的AVL树。那么如果树的插入删除很频繁(HashMap),AVL的性能就很拉胯。

2、红黑树

红黑树是属于二叉搜索树的一个分支。

2.1、性质

在这里插入图片描述

  1. 红黑树并不是一个完美平衡二叉查找树,从图上可以看到,根结点P的左子树显然比右子树高,但左子树和右子树的黑结点的层数是相等的,也即任意一个结点到到每个叶子结点的路径都包含数量相同的黑结点(性质5)。
  2. 所以我们叫红黑树这种平衡为黑色完美平衡

2.2、操作

  1. 左旋右旋和AVL树一样。(青岛王卓)

2.2.1、变色

  1. 节点颜色由红色变为黑色或者由黑变红

2.2.2、左旋

  1. 以某个结点作为支点(旋转结点),其右子结点变为旋转结点的父结点,右子结点的左子结点变为旋转结点的右子结点,左子结点保持不变。(哪个结点旋转进行左旋,其结点右子树的左子树会被调整到该节点旋转之后的右子树)
    在这里插入图片描述

2.2.3、右旋

  1. 以某个结点作为支点(旋转结点),其左子结点变为旋转结点的父结点,左子结点的右子结点变为旋转结点的左子结点,右子结点保持不变。(哪个结点旋转进行右旋,其结点左子树的右子树会被调整到该节点旋转之后的左子树)

在这里插入图片描述

2.2.4、查找

  1. 同二叉搜索树。

2.2.5、插入

  1. 查找插入的位置
  2. 插入后自平衡。
  3. 注意:插入节点,必须为红色,理由很简单,红色在父节点(如果存在)为黑色节点时,红黑树的黑色平衡没被破坏,不需要做自平衡操作。
  4. 但如果插入结点是黑色,那么插入位置所在的子树黑色结点总是多1,必须做自平衡。

2.3、插入情景

2.3.1、红黑树为空树

此时直接把插入结点作为根结点就行,根据红黑树性质2:根节点必须是黑色。还需要把插入结点设为黑色。

2.3.2、插入结点的Key已存在

直接进行值更新
在这里插入图片描述

2.3.3、插入结点的父结点为黑结点

由于插入的结点是红色的,当插入结点的黑色时,并不会影响红黑树的平衡,直接插入即可,无需做自平衡。
在这里插入图片描述

2.3.4、插入节点的父节点为红色

红黑树的性质2:根结点是黑色。如果插入节点的父结点为红结点,那么该父结点不可能为根结点,所以插入结点总是存在祖父结点。这一点很关键,因为后续的旋转操作肯定需要祖父结点的参与。
在这里插入图片描述

2.3.4.1、叔叔结点存在并且为红结点

依据红黑树性质4可知,红色节点不能相连 ==> 祖父结点肯定为黑结点;
因为不可以同时存在两个相连的红结点。那么此时该插入子树的红黑层数的情况是:黑红红。显然最简单的处理方式是把其改为:红黑红
处理:

  1. 将P和U节点改为黑色(爸爸叔叔改为黑色)
  2. 将PP改为红色(爷爷改为红色)
  3. 将PP设置为当前节点,进行后续处理(以爷爷为当前结点进行后续处理)
    在这里插入图片描述

2.3.5、叔叔结点不存在或为黑结点,并且插入结点的父亲结点是祖父结点的左子结点

注意:单纯从插入前来看,叔叔节点非红即空(NIL节点),否则的话破坏了红黑树性质5,此路径会比其它路径多一个黑色节点。
在这里插入图片描述

2.3.5.1、新插入节点,为其父节点的左子节点(LL红色情况)

在这里插入图片描述

处理:

  • 变颜色:将P设置为黑色,将PP设置为红色
  • 对PP节点进行右旋
    在这里插入图片描述

2.3.5.1、新插入节点,为其父节点的右子节点(LR红色情况)

在这里插入图片描述

处理:

  • 对P进行左旋
  • 将P设置为当前节点,得到LL红色情况
  • 按照LL红色情况处理(1.变颜色 2.右旋PP)
    在这里插入图片描述

2.3.6、叔叔结点不存在或为黑结点,并且插入结点的父亲结点是祖父结点的右子结点

在这里插入图片描述

2.3.6.1、新插入节点,为其父节点的右子节点(RR红色情况)

在这里插入图片描述
处理:

  1. 变颜色:将P设置为黑色,将PP设置为红色
  2. 对PP节点进行左旋
    在这里插入图片描述

2.3.6.2、新插入节点,为其父节点的左子节点(RL红色情况)

在这里插入图片描述
处理:

  1. 对P进行右旋
  2. 将P设置为当前节点,得到RR红色情况
  3. 按照RR红色情况处理(1.变颜色 2.左旋PP)
    在这里插入图片描述

2.4、案例演示

原树,插入结点值为7。
在这里插入图片描述

step1:插入之后,此时属于2.3.4.1的情况(插入的节点的父结点为红色,且叔叔结点也是红色),那么先进行变色(此时有叔叔结点,并且为红色,那么将父亲结点和叔叔结点染黑,爷爷结点变红,以爷爷为当前结点进行后续处理):
在这里插入图片描述
step2:以爷爷为当前结点进行处理,分析此时属于2.3.6.1(父结点为红色,并且叔叔结点不存在或者黑色,且父结点是爷爷结点的左子树),那么此时对以5为根的子树先进行左旋(左旋:以哪个结点进行左旋转,其右子结点作为新的根节点,右子树的左子树作为旋转结点的右子树)

在这里插入图片描述
step3:此时5和15都是红色(将以5为根的子树,直接当成一个红5就行),那么此时属于2.3.(父结点是红色,叔叔结点不存在或者是黑色,且父亲结点是爷爷结点的左子树),那么首先进行染色,将父亲结点染红,爷爷结点染黑
在这里插入图片描述
step4:因为树的根节点必须要是黑的,那么以19为当前结点进行右旋(右旋:哪个结点进行右旋,其左子结点作为根,同时左子结点的右子树作为旋转结点的左子树),完成平衡。
在这里插入图片描述

2.5、总结

在这里插入图片描述


http://chatgpt.dhexx.cn/article/0LhB4LrT.shtml

相关文章

红黑树原理及代码实现(一)

红黑树简介 红黑树是一种自平衡的二叉查找树,它的统计性能要优于平衡二叉树,因此在很多地方都有应用,例如Java中的TreeMap,HashMap等数据结构都使用到了红黑树。红黑树对很多人来说熟悉而陌生,熟悉则是因为知道红黑树…

图解红黑树原理

一.红黑树的性质(一种自平衡的二叉查找树) 1. 根节点是黑色。 2. 节点是红色或黑色 3. 叶子节点都是黑色的空节点(NIL节点) 意思就是末尾一排是黑色空节点(可全部省略) (叶子节点意思是没有子…

红黑树原理和算法详细介绍

目录 1 R-B Tree简介 2 红黑树的时间复杂度和相关证明 3 红黑树的基本操作 1. 左旋 2. 右旋 3. 添加 4.1 删除 1 R-B Tree简介 R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种特殊的二叉查找树。红黑树的每个节点上都有存储…

HashMap底层红黑树原理(超详细图解)+手写红黑树代码

在看完了小刘老师和黑马的源码视频之后,我整理了一篇HashMap的底层源码文章,学海无涯,这几天看了对红黑树的讲解,故将其整理出来 HashMap底层源码解析上 HashMap底层源码解析下 视频链接 小刘老师讲源码 传智播客-黑马程序员 文章目录 树结…

红黑树原理及java实现

红黑树 红黑树规则特点: 节点分为红色或者黑色;根节点必为黑色;叶子节点都为黑色,且为null;连接红色节点的两个子节点都为黑色(红黑树不会出现相邻的红色节点);从任意节点出发&…

红黑树原理及旋转

红黑树,本质上来说就是一棵二叉查找树 但它在二叉查找树的基础上增加了着色和相关的性质使得红黑树相对平衡 保证了红黑树的查找、插入、删除的时间复杂度最坏为O(log n) 但它是如何保证一棵n个结点的红黑树的高度始终保持在h logn的呢?这就引出了红黑…

HashMap红黑树原理分析

近期学习了 HashMap 实现原理,这篇咱们了解一下红黑树的设计,相比 jdk1.7 的 HashMap 而言,jdk1.8最重要的就是引入了红黑树的设计,当hash表的单一链表长度超过 8 个的时候,链表结构就会转为红黑树结构。 01、故事的起…

HashMap源码学习:红黑树原理详解

文章导航 HashMap源码学习:红黑树原理详解 HashMap源码学习:JDK1.8版本源码解析 目录 文章导航前言概述红黑树的特性变色平衡右旋平衡左旋平衡 正文红黑树平衡方法:balanceInsertion红黑树左旋方法:rotateLeft红黑树右旋方法&…

红黑树原理讲解

红黑树原理讲解 一、红黑树的性质二、红黑树的3种变化策略?(为满足红黑树性质)1. 改变颜色2. 左旋3. 右旋 三、红黑树的插入情景1:红黑树为空树情景2:插入节点的key已经存在情景3:插入节点的父节点为黑色情…

红黑树原理详解

红黑树原理详解 红黑树的旋转红黑树上结点的插入红黑树上结点的删除 参考: 教你初步了解红黑树 红黑树(一)之 原理和算法详细介绍 红黑树定义: (1) 每个节点或者是黑色,或者是红色。 (2) 根节点是黑色。 (3) 每个叶子节点是黑色。 [注意&…

红黑树原理

因为看的时候写在了纸上,于是直接扫描的,效果不太好。

HashMap红黑树原理解析

HashMap红黑树原理解析 定义: 简单来说红黑树是一种近视平衡二叉查找树,主要优点是”平衡”,即左右子树高度几乎一致,以此来防止树退化为链表,通过这种方式来保障查找的时间复杂度为log(n)。 下面先主要提一下红黑树…

红黑树的原理及实现

红黑树的原理及实现 一、什么是红黑树二、定义红黑树三、左旋和右旋四、红黑树插入节点 一、什么是红黑树 红黑树是一种特定类型的二叉树,它是在计算机科学中用来组织数据比如数字的块的一种结构。 红黑树是一种平衡二叉查找树的变体,它的左右子树高差有…

【图文详解】彻底了解红黑树底层实现原理

红黑树定义 红黑树(Red Black Tree) 是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。 红黑树是一种特化的AVL树(平衡二叉树),都是在进行插入和删除操…

红黑树(一)之 原理和算法详细介绍

概要 目录1 红黑树的介绍2 红黑树的应用3 红黑树的时间复杂度和相关证明4 红黑树的基本操作(一) 左旋和右旋5 红黑树的基本操作(二) 添加6 红黑树的基本操作(三) 删除 作者:Sky Wang 于 2013-08-08 概述:R-B Tree&#xff…

数据结构 | 【红黑树】图解原理

今天我们要说的红黑树就是就是一棵非严格均衡的二叉树,均衡二叉树又是在二叉搜索树的基础上增加了自动维持平衡的性质,插入、搜索、删除的效率都比较高。红黑树也是实现 TreeMap 存储结构的基石。 红黑树就是非严格均衡的二叉搜索树。 一、红黑树规则特…

红黑树原理简单解析

一、红黑树为什么会出现呢? 是因为二叉搜索树有可能会出现极端的情况,就是只有一侧有数据,那这样的话就会降级为链表。后来出现了平衡二叉树,但是由于强制平衡所导致付出的代价比较高昂,所以黑红树出现了。 二、简介…

laravel框架的下载与安装

首先我们先访问这个网址https://github.com/laravel/laravel 可以使用git克隆 或者直接下载安装包到自己的www目录下解压,此时访问localhost下的laravel目录, 此时会报没有vendor文件夹的一个错, 如果你已经下载了composer 在该文件夹目录下…

Laravel

Laravel的安装 1.确认composer已经安装 2.配置homestead.yaml文件sites:- map: laravel.xyz//域名配置to: /home/vagrant/code/laravel/public//入口文件路径 databases://数据库- laravel 3.用秘钥登录homestead 4.更换中国镜像: composer…

Laravel下载文件及文档

2019独角兽企业重金招聘Python工程师标准>>> Laravel学院提供的相关资源下载 中文文档 Laravel 5.6 中文文档:PDF(兼容 5.5 文档) Laravel 5.3 中文文档:CHM | PDF Laravel 5.2 中文文档:CHM | PDF Laravel…