广告
返回顶部
首页 > 资讯 > 前端开发 > VUE >怎么彻底理解红黑树
  • 518
分享到

怎么彻底理解红黑树

2024-04-02 19:04:59 518人浏览 薄情痞子
摘要

本篇内容主要讲解“怎么彻底理解红黑树”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么彻底理解红黑树”吧!二叉树满足以下两个条件的树就是二叉树:本身是有序树(若

本篇内容主要讲解“怎么彻底理解红黑树”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么彻底理解红黑树”吧!

二叉树

满足以下两个条件的树就是二叉树

  • 本身是有序树(若将树中每个结点的各子树看成是从左到右有次序的(即不能互换),则称该树为有序树(Ordered Tree))。

  • 树中包含的各个节点的度不能超过 2,即只能是 0、1 或者 2。

简单地理解,二叉树(Binary tree)是每个节点最多只有两个分支(即不存在分支度大于 2  的节点)的树结构。通常分支被称作“左子树”或“右子树”。

怎么彻底理解红黑树

二叉查找树

要了解红黑树之前,免不了先看下二叉查找树是什么。

维基百科上的定义:二叉查找树(英语:Binary Search Tree),也称为二叉搜索树、有序二叉树(ordered binary  tree)或排序二叉树(sorted binary tree),是指一棵空树或者具有下列性质的二叉树。

若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值;若任意节点的右子树不空,则右子树上所有节点的值均大于或等于它的根节点的值;任意节点的左、右子树也分别为二叉查找树。

图示理解:

怎么彻底理解红黑树

上图为查找值为29的节点,有以下步骤:

  • 查看根节点 41。

  • 因为 41>29,所以查看 41 的左孩子 20。

  • 因为 20<29,所以查看 20 的右孩子 29,发现其正好是要查看的节点。

退化

二叉查找树有个非常严重的问题,如果数据的插入是从大到小插入的,或者是从小到大插入的话,会导致二叉查找树退化成单链表的形式,俗称“瘸子“。

左瘸子:例如,插入数据依次为 {5,4,3,2,1}(从大到小),则如下图所示:


怎么彻底理解红黑树

右瘸子:例如,插入数据依次为{1,2,3,4,5}(从小到大),则如下图所示:

怎么彻底理解红黑树

为了解决该问题,出现了一些解决方法,即平衡,能够使得树趋向平衡,这种自平衡的树叫做平衡树。

平衡树

平衡树(Balance Tree,BT)指的是,任意节点的子树的高度差都小于等于 1。

常见的符合平衡树的有 AVL 树(二叉平衡搜索树),B 树(多路平衡搜索树,2-3 树,2-3-4 树中的一种),红黑树等。

AVL 树

AVL 树(由发明者 Adelson-Velsky 和 Landis 的首字母缩写命名),是指任意节点的两个子树的高度差不超过 1  的平衡树。又称自平衡二叉搜索树。

AVL 树能解决上文二叉查找树中的右瘸子问题,例如,插入数据依次为 {1,2,3,4,5}(从小到大),则如下图所示:

怎么彻底理解红黑树

AVL 树会对不符合高度差的结构进行调整,从而使得二叉树趋向平衡。

2-3 树

2-3 树,是指每个具有子节点的节点(内部节点,internal  node)要么有两个子节点和一个数据元素,要么有三个子节点和两个数据元素的自平衡的树,它的所有叶子节点都具有相同的高度。

简单点讲,2-3 树的非叶子节点都具有两个分叉或者三个分叉,所以,称作 2 叉-3 叉树更容易理解。

另外一种说法,具有两个子节点和一个数据元素的节点又称作 2 节点,具有三个子节点和两个数据元素的节点又称作 3 节点,所以,整颗树叫做 2-3  树。

怎么彻底理解红黑树

所有叶子点都在树的同一层,一样高:

  • 性质 1:满足二叉搜索树的性质。

  • 性质 2:节点可以存放一个或两个元素。

  • 性质 3:每个节点有两个或三个子节点。

创建 2-3 树的规则

插入操作如下:

向 2-节点中插入元素:

怎么彻底理解红黑树

向一颗只含有一个 3-节点的树中插入元素:

怎么彻底理解红黑树

2-3-4 树

含义如下:

  • 2 节点:包含两个子节点和一个数据元素。

  • 3 节点:包含三个子节点和一个数据元素。

  • 4 节点:包含四个子节点和一个数据元素。


怎么彻底理解红黑树

2-3-4 树,它的每个非叶子节点,要么是 2 节点,要么是 3 节点,要么是 4 节点,且可以自平衡,所以称作 2-3-4 树。

规则如下:

  • 规则 1:加入新节点时,不会往空的位置添加节点,而是添加到最后一个叶子节点上。

  • 规则 2:四节点可以被分解三个 2-节点组成的树,并且分解后新树的根节点需要向上和父节点融合。

插入操作

原本的 2-3-4 树,如下图:

怎么彻底理解红黑树

对于上图的 2-3-4 树,插入一个节点 17,由于规则 1,节点 17 不会加入节点  [16,18,20] 的子树,而是与该节点融合。

怎么彻底理解红黑树

由于规则 2,节点 [16,17,18,20] 是一个 4 节点,将该节点进行拆解成新的树,将 18 作为子树的根节点进行拆分。

怎么彻底理解红黑树

此时树暂时失去了平衡,我们需要将拆分后的子树的根节点向上进行融合。

怎么彻底理解红黑树

同理可得,由于规则 2,节点 [6,10,14,18] 是一个 4 节点,将该节点进行拆解成新的树,将 14 作为子树的根节点进行拆分,完成了 2-3-4  树的构建。

怎么彻底理解红黑树

总结了下插入节点的过程,无非也就为了符合两条规则,那么,2-3 树,2-3-4 树都有了,那是不是也有 2-3-4-5 树,2-3-4-5--...-n  树的存在呢?

事实上是有的,世人把这一类树称为一个名字:B 树。

B 树

B 树,表示的是一类树,它允许一个节点可以有多于两个子节点,同时,也是自平衡的,叶子节点的高度都是相同的。

所以,为了更好地区分一颗 B 树到底属于哪一类树,我们给它一个新的属性:度(Degree):一个节点能有多少箭头指向其他节点。

具有度为 3 的 B 树,表示一个节点最多有三个子节点,也就是 2-3 树的定义。具有度为 4 的 B 树,表示一个节点最多有四个子节点,也就是  2-3-4 树的定义。

图为 4 的 B 树的示例图:

怎么彻底理解红黑树

红黑树

怎么彻底理解红黑树

R-B Tree,全称是 Red-Black Tree,又称为“红黑树”,它一种特殊的二叉查找树。

红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black)。

如何理解红黑树

一个经典的红黑树,如下图所示(省略了叶子节点都是黑色的 NIL 节点):

怎么彻底理解红黑树

怎么彻底理解红黑树

如第二张图所示,将该红黑树与上文讲到的 2-3-4 树对比,是否发现,红黑树就是一个 2-3-4 树:

  • 每个节点或者是黑色,或者是红色。

  • 根节点是黑色。

  • 每个叶子节点(NIL)是黑色。注意:这里叶子节点,是指为空(NIL 或NULL)的叶子节点!

  • 如果一个节点是红色的,则它的子节点必须是黑色的。由于红黑树的每个节点都是由 2-3-4 树转化而来的,从而红色节点不能连续两个出现,不然会出现 4  节点的情况,导致违反了规则 2。

而且红黑树的每一个黑节点都是 3 节点中的最中间的那个值,或者是 2 节点中其中一个值。

  • 从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。

原因:红黑树这些黑色节点在 2-3-4 树中代表的是由 1 节点的一个 2-3-4 树,而 2-3-4  树是同一个子树的深度是相同的,平衡的,所以从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。

如下图所示,蓝色代表是黑色节点:

怎么彻底理解红黑树

注意如下几点:

  • 特性(3)中的叶子节点,是只为空(NIL 或 null)的节点。

  • 特性(5),确保没有一条路径会比其他路径长出俩倍。因而,红黑树是相对是接近平衡的二叉树。

  • 红黑树虽然本质上是一棵二叉查找树,但它在二叉查找树的基础上增加了着色和相关的性质使得红黑树相对平衡,从而保证了红黑树的查找、插入、删除的时间复杂度最坏为  O(log n)。

由上面的例子所示,我们只要把红黑树当做是 2-3-4 树来处理,并且对应的颜色进行改变或者进行左旋右旋的操作,即可达到使得红黑树平衡的目标。

如何保持红黑树的结构

当我们插入一个新的节点的时候,如何保证红黑树的结构依然能够符合上面的五个特性呢?

树的旋转分为左旋和右旋,下面借助图来介绍一下左旋和右旋这两种操作。

①左旋

原本的状态:

怎么彻底理解红黑树

过程图:

怎么彻底理解红黑树

结束图:

怎么彻底理解红黑树

如上图所示,当在某个目标结点 E 上,做左旋操作时,我们假设它的右孩子 S 不是 NIL。

左旋以 S 到 E 之间的链为“支轴”进行,它使 S 成为该子树的新根,而 S 的左孩子则成为 E 的右孩子。

②右旋

原先状态图:

怎么彻底理解红黑树

过程图:

怎么彻底理解红黑树

结束图:

怎么彻底理解红黑树

同左旋类似,当在某个目标结点 S 上,做右旋操作时,我们假设它的右孩子 S 不是 NIL。

左旋以 S 到 E 之间的链为“支轴”进行,它使 S 成为该子树的新根,而 S 的左孩子则成为 E 的右孩子。

到此,相信大家对“怎么彻底理解红黑树”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: 怎么彻底理解红黑树

本文链接: https://www.lsjlt.com/news/84521.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么彻底理解红黑树
    本篇内容主要讲解“怎么彻底理解红黑树”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么彻底理解红黑树”吧!二叉树满足以下两个条件的树就是二叉树:本身是有序树(若...
    99+
    2022-10-19
  • 电脑c盘变红怎么彻底清理
    电脑C盘变红通常是指C盘存储空间不足或者有大量的临时文件堆积,导致硬盘空间不足。以下是一些彻底清理C盘的方法:1. 删除临时文件:打...
    99+
    2023-09-05
    电脑
  • 解析ConcurrentHashMap: 红黑树的代理类(TreeBin)
    目录1、TreeBin内部类分析2、treeifyBin方法分析3、find方法分析总结前一章是get、remove方法分析,喜欢的朋友点击查看。本篇为ConcurrentHashM...
    99+
    2022-11-12
  • 红黑树的实现原理是什么
    本篇文章给大家分享的是有关红黑树的实现原理是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一、摘要平衡二叉查找树是一个高度平衡的二叉树,也...
    99+
    2022-10-19
  • java实现红黑树的代码怎么写
    本篇内容介绍了“java实现红黑树的代码怎么写”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! 红黑树ja...
    99+
    2022-10-19
  • C++红黑树应用之set和map怎么使用
    这篇文章主要介绍“C++红黑树应用之set和map怎么使用”,在日常操作中,相信很多人在C++红黑树应用之set和map怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++红黑树应用之set和map怎...
    99+
    2023-07-05
  • win11怎么彻底清理c盘
    清理C盘可以采取以下步骤:1. 清理临时文件:打开“文件资源管理器”,在地址栏中输入“%temp%”并回车,删除所有临时文件。2. ...
    99+
    2023-08-22
    win11
  • win10怎么彻底清理c盘
    要彻底清理Windows 10的C盘,您可以按照以下步骤进行操作:1. 清理临时文件:- 按下Win + R键,打开“运行”对话框,...
    99+
    2023-08-19
    win10
  • 彻底理解golang中什么是nil
    nil是什么 相信写过Golang的程序员对下面一段代码是非常非常熟悉的了: if err != nil { // do something.... } 当出现不等于n...
    99+
    2022-11-12
  • 怎么彻底解决电脑蓝屏0×00000008E
    本文小编为大家详细介绍“怎么彻底解决电脑蓝屏0×00000008E”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么彻底解决电脑蓝屏0×00000008E”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。彻底解决电...
    99+
    2023-07-01
  • Linux怎么彻底清理Oracle 11g RAC环境
    这篇文章主要讲解了“Linux怎么彻底清理Oracle 11g RAC环境”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux怎么彻底清理Oracle ...
    99+
    2022-10-18
  • win7右下角操作中心带红叉的小白旗子怎么彻底去掉?
    安装完Windows7系统后,在桌面右下角任务栏通知区里面,大家能看到一个带红叉的白色小旗帜,对于强迫症朋友或是有点电脑洁癖的人是看不得的,总想把它去掉。那么win7右下角操作中心带红叉的小白旗子怎么彻底去掉方法其实很简...
    99+
    2023-06-06
    win7右下角操作中心的小旗子 旗子 红叉 中心 操作
  • 怎么用bat批处理彻底隐藏文件
    这篇文章主要介绍“怎么用bat批处理彻底隐藏文件”,在日常操作中,相信很多人在怎么用bat批处理彻底隐藏文件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用bat批处理彻底隐藏文件”的疑惑有所帮助!接下来...
    99+
    2023-06-08
  • 电脑老是弹出广告怎么彻底解决
    这篇“电脑老是弹出广告怎么彻底解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“电脑老是弹出广告怎么彻底解决”文章吧。电脑老...
    99+
    2023-07-02
  • 局域网arp断网攻击怎么彻底解决
    局域网ARP断网攻击是一种恶意攻击行为,攻击者会发送伪造的ARP包来欺骗目标设备,导致目标设备无法正常访问网络。解决此问题需要采取以...
    99+
    2023-06-03
    arp断网攻击
  • win10中cpu占用过高问题怎么彻底解决
    高CPU占用问题可能由多种原因引起,以下是一些可能的解决方法: 更新操作系统和驱动程序:确保你的Windows 10系统和所有驱...
    99+
    2023-10-22
    win10
  • Win10红警黑屏只有看到电脑鼠标怎么解决Win10红警打开黑屏仅有光标该怎么办
    红警是一款传统的策略类游戏,近期有客户说他在玩红警是发生了黑屏的状况,但显示屏上只有见到电脑鼠标,仅有光标在的会也没法继续玩该软件了,那麼Win10红警打开黑屏仅有光标怎么办呢,下边小编给大伙儿共享Win10红警黑屏只有看到电脑鼠标的解决方...
    99+
    2023-07-10
  • 怎么理解二叉树
    本篇文章为大家展示了怎么理解二叉树,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。大白话讲解二叉树比如现在有个数组,存放了很多用户的名字,需要从这个数组中找到包含指定...
    99+
    2022-10-19
  • win11底部状态栏变成了黑色怎么解决
    这篇文章主要介绍了win11底部状态栏变成了黑色怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇win11底部状态栏变成了黑色怎么解决文章都会有所收获,下面我们一起来看看吧。win11底部状态栏变成了黑色...
    99+
    2023-07-02
  • 怎么用bat批处理彻底删除0KB顽固文件或文件夹
    本篇内容主要讲解“怎么用bat批处理彻底删除0KB顽固文件或文件夹”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用bat批处理彻底删除0KB顽固文件或文件夹”吧!今天一同事的电脑桌面上有一个...
    99+
    2023-06-08
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作