IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【数据结构与算法】【16】红黑树 -> 正文阅读

[数据结构与算法]【数据结构与算法】【16】红黑树

什么是红黑树

红黑树是在AVL树的基础上改进的一种二叉查找树,英文名R-B Tree

上一篇我们已经讲过,AVL树是一种高度平衡的二叉查找树

它的查找效率最高,但是由于要维护平衡性,插入和删除效率便降低了

红黑树则是降低了一点平衡性的要求,从而来提升插入和删除效率

由于在实际场景中,很难有数据只查询不修改的,因此红黑树的适用场景更广,综合效率更高

红黑树的特性

红黑树的节点必须满足以下五个特性

  1. 每个节点带有颜色,要么红色,要么黑色
  2. 根节点必须为黑色
  3. 叶节点必须为黑色(红黑树所有的叶节点,都是虚构出来的NIL节点,这是为了方便调整红黑树的平衡性)
  4. 每个红节点的孩子必定为黑色(不存在两个连续的红色节点)
  5. 任意节点,到其所有的叶节点,中间经过的黑色节点数量是相同的

以上规定,最终决定了红黑树的平衡性:

根节点到任意叶节点的最长路径,不多于最短路径的两倍(路径全黑时最短,红黑相间时最长)

可见,红黑树中的节点平衡因子,是可以大于1的

在这里插入图片描述

红黑树插入时的平衡性修复

红黑树的平衡修复,主要是通过染色、左旋、右旋三种方式来实现的

在向红黑树插入新节点时,我们一般都将节点染成红色

因为插入红色节点时,只需要处理两个节点连续红色的问题,比较容易修复

如果插入黑色节点,则会出现根节点到叶节点黑色点数量异常的问题,这个比较难修复

红黑树的插入大致可以分为七大类情形,在讲述这七大类情形时,我们先了解一下术语定义

在这里插入图片描述

  • N:Now,刚插入的待平衡的新节点
  • P:Parent,新节点的父节点
  • GP:GrandParent:祖父节点,即父节点的父节点
  • U:Uncle,叔父节点,即父节点的兄弟节点

情形一:N为根节点

N染成黑色,直接作为红黑树根节点即可,修复完成

情形二:P为黑色

黑色点数量不变,不影响平衡性,无需任何处理,修复完成

情形三:P为红色,U为红色

在这里插入图片描述
P和U染黑,GP染红。再以GP作为新的N节点,递归修复平衡性

情形四:P为红色,U为黑色,P左N左

在这里插入图片描述
GP右旋,P染黑,GP染红,修复完成

情形五:P为红色,U为黑色,P右N右

在这里插入图片描述
GP左旋,P染黑,GP染红,修复完成

情形六:P为红色,U为黑色,P左N右

在这里插入图片描述
N右旋。再以P作为新的N节点,递归修复平衡性

情形七:P为红色,U为黑色,P右N左

在这里插入图片描述
N左旋。再以P作为新的N节点,递归修复平衡性

红黑树删除时的平衡性修复

红黑树的删除比较繁琐,分为很多种情况,每种情况又有很多子类型

整体上,根据节点位置,可以分为四大类情况

  1. 删除节点为叶节点
  2. 删除节点只有左孩子,没有右孩子
  3. 删除节点只有右孩子,没有左孩子
  4. 删除节点既有左孩子,又有右孩子

下面我们逐个情况来讲解如何进行删除和再平衡

在此之前,我们先要搞清楚,怎么样才算平衡性修复成功

这个判断标准就是:根节点到所有NIL节点的黑色出现次数,和平衡之前相等

我们统一将被删除节点称为D节点,D节点兄弟为B节点,D节点父亲为P节点,B节点孩子分为LN和RN节点

1 D为叶节点

这种情况又分为D为红色,D为黑色两大类情况

1-1 D为红色

直接删除D节点即可

在这里插入图片描述
1-2 D为黑色

这又分为D在P左侧,以及D在P右侧的情况,我们只讲解D在左侧的情况,另一种情况处理方式是一样的

对于红黑树的任意叶节点,其最下面两层的结构,只可能是以下五种情况

在这里插入图片描述

由于D为黑色,且为叶节点,要保持平衡性,则P右侧必有一个黑色节点,且最多两层,只可能是以下五种情况

在这里插入图片描述
由于这个情况下包含太多子情景了,我们先讲234的情况

2 D有左孩子,没有右孩子

LC的值赋给D,删除LC

在这里插入图片描述
3 D有右孩子,没有左孩子

RC的值赋给D,删除RC

在这里插入图片描述
4 D有左孩子,也有右孩子

LC的值赋给D,问题转换为递归删除LC

在这里插入图片描述
下面我们回到前面的问题,再来讲解D为叶节点,且D为黑色的五种情况

1-2-1

在这里插入图片描述
1-2-2
在这里插入图片描述

1-2-3
在这里插入图片描述

1-2-4
在这里插入图片描述

1-2-5
在这里插入图片描述

红黑树代码实现

红黑树实现代码的核心是插入和删除后的再平衡

由于红黑树的情景实在是太多了,这里不再逐个实现,一般面试也不会让大家手动去实现红黑树

但是当大家拿到一张红黑树的图时,自己应当知道如何去删除某个节点并进行平衡修复

红黑树特性和应用

普通二叉查找树,查找、插入、删除操作,在最坏情况下复杂度是O(n),最好情况下复杂度是O(logN)

而红黑树则可以保证,在最坏情况下复杂度为O(logN),整体效率比普通二叉查找树高很多

红黑树在Java中的主要应用场景有HashSet和HashMap

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-10-08 21:07:03  更:2022-10-08 21:10:47 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 19:24:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码