终于搞懂红黑树!--红黑树的原理及操作
红-黑-树
介绍:
红黑树( Red black tree)是种自平衡二叉查找树,在计算机科学中用到的一种数据结构。
它是在1972年由 Rudolf Bayer发明的当时被称为平衡二叉B树( symmetric binary B-trees)。后来,在1978年被 Leo. guibas和 Robert sedgewick修改为如今的红黑树R-B Tree,全称是Red- Black tree,又称为“红黑树",它一种特殊的二叉查找树。红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red或黑(Back)
性质:
- 红黑树是一棵平衡二叉搜索树,其中序遍历单调不减
- 节点是红色或黑色。
- 根节点是黑色。
- 每个叶节点(也有称外部节点的,目的是将红黑树变为真二叉树,即NULL节点,空节点)是黑色的。
- 每个红色节点的两个子节点都是黑色。(换句话说,从每个叶子到根的所有路径上不能有两个连续的红色节点)
- 从根节点到每个叶子的所有路径都包含相同数目的黑色节点(这个数值叫做黑高度)。
观察下面这颗红黑树(自行脑补外部节点NULL)
事实,每一颗红黑树都有等价的B-树,如上图的红黑树对应的等价B-树(2,3,4树)如下:
因此,学好红黑树的诀窍就是:心中有B-树
左旋与右旋:
左旋:
右旋 :
具体旋转类型与操作请点:LL,RR,LR,RL
插入的调整策略:
在对红黑树进行插入操作时,我们一般总是插入红色的节点,因为这样可以在插入过程中尽量避免对树的调。
那么,我们插入一个节点后,可能会使原树的哪些性质改变列?
如果插入的节点是根节点,性质2会被破坏,如果插入节点的父节点是红色,则会破坏性质4.
因此,总而言之,插入一个红色节点只会破坏性质2或性质4我们的恢复策略很简单,插入修复具体操作情况:
情况1:
- 插入的是根节点。
- 原树是空树,此情况只会违反性质2。
对策:直接把此节点涂为黑色。
情况2:
- 插入的节点的父节点是黑色
- 此不会违反性质2和性质4,红黑树没有被破坏。
对策:什么也不做。
情况3:当前节点的父节点是红色且祖父节点的另一个子节点(叔叔节点)是红色
此时父节点的父节点一定存在,否则插入前就已不是红黑树。与此同时,又分为父节点是祖父节点的左子还是右子,对于对称性,我们只要解开一个方向就可以了。在此,我们只考虑父节点为祖父左子的情况。同时,还可以分为当前节点是其父节点的左子还是右子,但是处理方式是一样的。我们将此归为同一类
对策:将当前节点的父节点和叔叔节点涂黑,祖父节点涂红,把当前节点指向祖父节点,从新的当前节点重新开始算法。
情况4:当前节点的父节点是红色叔叔节点是黑色,当前节点是其父节点的右子
对策:当前节点的父节点做为新的当前节点,以新当前节点为支点左旋。
情况5:当前节点的父节点是红色叔叔节点是黑色,当前节点是其父节点的左子
策略:父节点变为黑色,祖父节点变为红色,在祖父节点为支点右旋
针对情况3:
观察这棵树的一个结点N的值为4,显然4是红色的,它的父节点也是红色的,所以违背了(红色结点的子节点都是黑色的)性质
那么我们针对这种情况,利用情况三的对策,将当前节点的父节点和叔叔节点涂黑,祖父节点涂红,把当前节点指向祖父节点;
调整后:
调整后发现( 2->7 )还是违背红黑树的性质,那么观察后发现这是第4种情况;
当前7结点:
利用情况4的策略:当前节点的父节点做为新的当前节点,以新当前节点为支点左旋。
调整后:
调整后发现还是不符合(可能开始想这树怎么这么多B事!难道是B树?),这时我们会发现这是第五种情况:
当前2结点:
利用情况5的策略:父节点变为黑色,祖父节点变为红色,在祖父节点为支点右旋
这样就发现已经满足的了红黑树的性质
一个在线 动态数据结构可视化 的网址:https://www.cs.usfca.edu/~galles/visualization/RedBlack.html (我觉得很好用)
总结:经过上面情况3、情况4、情况5等3种插入修复情况的操作示意图,自会发现,后面的情况4、情况5都是针对情况3插入节点4以后,进行的一系列插入修复情况操作,不过,指向当前节点N指针一直在变化。所以,你可以认为:整个下来,情况3、4、5就是一个完整的插入修复情况的操作流程
树与二叉树:https://blog.csdn.net/alzzw/article/details/97283324
线索二叉树:https://blog.csdn.net/alzzw/article/details/97423394
哈夫曼树:https://blog.csdn.net/alzzw/article/details/97809047二叉搜索(排序)树;https://blog.csdn.net/alzzw/article/details/97563011
平衡二叉树:https://blog.csdn.net/alzzw/article/details/97613193B树~B+树:https://blog.csdn.net/alzzw/article/details/97633941
红黑树的应用场景:
- 标准模板库:
- 标准模板库:(英文:Standard Template Library,缩写:STL),是一个C++软件库,大量影响了C++标准程序库但并非是其的一部分。其中包含4个组件,分别为算法、容器、函数、迭代器。
- 模板是C++程序设计语言中的一个重要特征,而标准模板库正是基于此特征。标准模板库使得C++编程语言在有了同Jaa一样强大的类库的同时,保有了更大的可扩展性。
2.Java中的TreeMap
- Java中的TreeMap用于实现地图界面和可导航 -与抽象类一起映射。地图根据其键的自然顺序排序,或者由地图创建时提供的比较器排序,具体取决于使用的构造函数。这被证明是一种效率
3.Java HashMap
- HashMap中的哈希映射是Java 1.2以来Java集合的一部分。它提供了Java的Map接口的基本实现。它将数据存储在Key,Value)对中。要访问一个值,必须知道它的关键Hash Map被称为Hash Map,因为它使用了一种名为Hashing Hashing的技术
4.关联数组
- 在计算机科学中,关联数组(英语:Associative Array),又称映射(Map)、字典( Dictionary)是一个抽象的数据结构,它包含着类似于(键,值)的有序对。一个关联数组中的有序对可以重复(如C++中的 multimap)也可以不重复(如C++中的map)。
- 这种数据结构包含以下几种常见的操作向关联数组添加配对从关联数组内删除配对修改关联数组内的配对根据已知的键寻找配对
5.完全公平调度器
- 完全公平调度器(英语:Completely Fair Scheduler,缩写为CFS), Linux内核的一部分,负责进程调度。参考了康恩·科里瓦斯( Con Kolivas)提出的调度器源代码后,由匈牙利程式员英格·蒙内( ngo Molnar)所提出。在 Linux kernel2.6.23之后采用,取代先前的O(1)调度器,成为系统预设的调度器。它负责将CPU资源,分配给正在执行中的进程,目标在于最大化程式互动效能的同时,最小化整体CPU的运用。使用红黑树来实作,算法效率为O(log(n))
6.实时计算
- 实时运算(Rea- time computing)是计算机科学中对受到“实时约束”的计算机硬件和计算机软件系统的硏究,实时约束像是从事件发生到系统回应之间的最长时间限制。实时程序必须保证在严格的时间限制内响应。通常实时回应时间会是以毫秒为单位,也有时是以微秒为单位。相比之下,非实时系统是一种无法保证在任何条件下,回应时间均匹配实时约束限制的系统。有可能大多数的情形下,非实时系统都可以匹配实时约束限制,甚至更快,只是无法保证在任何条件都可以匹配约束限制。
- 在其他领域中也有用到“实时”这个词,但其含义不同:在仿真领域,实时是指“实时时钟同步”,此外在数据传输、多媒体处理和企业系统领域,实时意思是“感觉不到延迟”。
- 实时软件必须使用一种或多种同步编程语言、实时操作系统以及创建在一个实时软件应用程序上的实时网络提供的基本框架
7.计算几何
- 计算几何是一门兴起于二十世纪七十年代末的计算机科学的一个分支,主要研究解决几何问题的算法。计算机的岀现使得一些问题大幅简化,然而一些人类直观自从1946年世界上第一台电子计算机问世以来,计算机应用的一个重要里程碑是1962年美国麻省理工学院发明了世界上第一台图形显示器。自此之后,计算机可以通过图形显示器直接输入、输出图形,并且可以在显示屏上通过光标的移动而直接修改图形。而在这之前,工程师是通过一厚叠纸上密密麻麻的数字来间接表达工程图形的。
- 1962年被认为是美国和欧洲℃AD开始发展的一年。首先的应用领域是汽车、飞机和造船工业。这3个行业,由于其产品的外形曲面特别复杂,要求特别苛刻,而成为CAD首先应用的领域
之后还会补充其他关于红黑树的一些东西
终于搞懂红黑树!--红黑树的原理及操作相关推荐
- 终于搞懂了网红主播的套路
所有的网红主播成长之路都是先拍视频,把视频发到各大网站,让后用钱疯狂的砸流量,等待有了粉丝量以后就开直播,有些是纯直播,有些是带货.别小看这些网红直播,他们往往一次直播的收入能顶一个普通工人一年的薪水 ...
- 五分钟搞懂什么是红黑树
五分钟搞懂什么是红黑树(全程图解) 18-09-04 星925 + 关注 献花(2) 收藏 前戏 红黑树,对很多童鞋来说,是既熟悉又陌生.熟悉是因为在校学习期间,准备面试时,这是重点.然后经过多年的 ...
- IntelliJ IDEA 部署 Web 项目,终于搞懂了!
IntelliJ IDEA 部署 Web 项目,终于搞懂了! 这篇牛逼:Java 程序员必备的 Intellij IDEA 插件 IDEA 中最重要的各种设置项,就是这个 Project Struct ...
- 电压和电流反馈判别及例子,绝对让你通透,其实也没有那么难,一次就看懂!从此终于搞懂了电压反馈和电流反馈!
电压和电流反馈判别及例子,其实也没有那么难,绝对让你通透,一次就看懂!从此终于搞懂了电压反馈和电流反馈! 一个简单粗暴的判断方法: 先看反馈是否直接连到Uo输出端(若不是直接从输出端引出,则为电流反馈 ...
- 一文搞懂 Cocos Creator 3.0 坐标转换原理
一文搞懂 Cocos Creator 3.0 坐标转换原理 屏幕坐标 UI 触点坐标 UI 多分辨率适配方案 UI 触点获取 不同坐标之间的转换 屏幕坐标与 3D 节点世界坐标互转 3D 节点之间的坐 ...
- 五分钟搞懂什么是红黑树(全程图解)
红黑树(又叫平衡二叉树),对很多童鞋来说,是既熟悉又陌生.熟悉是因为在校学习期间,准备面试时,这是重点.然后经过多年的荒废,如今已经忘记的差不多了.如果正在看文章的你,马上快要毕业,面临着找工作的压力 ...
- 关于子网掩码怎么计算!!!!我终于搞懂了!!!!
今天终于搞明白了子网掩码啥的是啥意思了!!!我写几个就我自己看懂的! 1.首先ip呢都是XXX.XXX.XXX.XXX这样组成的然后一般来说就是255.255.255.255,对应的二进制文件就是11 ...
- HTTPS 终于搞懂了 !
点击上方"芋道源码",选择"设为星标" 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | ...
- 蚊子凭啥只咬你?科学家用 5 年造出一批“脑子发光”的蚊子,终于搞懂背后机制
为了发篇 Nature,他们一天用自己喂了 3000 只蚊子?! 听起来有些不可思议,但却是普林斯顿大学一群研究人员在做的事情 -- 他们试图找出这些蚊子专门吸人血的原因. 我们都知道,有不少蚊子会吸 ...
- cad布局怎么用_终于搞懂CAD的布局是个什么玩意儿了!原来布局要这样用
很多初学的小伙伴都没搞懂CAD布局是怎么一回事儿,其实也没你想像的那么难.今天小编就来跟大家说一说,关于如何新建布局和比例设置等内容,希望对大家有所帮助. 一.布局视口如何定义 1.命令 模型定义布局 ...
最新文章
- SAP MM 计量单位EA的数量可以有小数点
- [Tkinter 教程] 布局管理 (Pack Place Grid)
- 【EventBus】EventBus 源码解析 ( 注册订阅者总结 | EventBus 注册订阅者流程梳理 )
- android 关机 流程_Android系统关机的全流程解析
- 计算机视觉的基石-滤波
- pythonencode_python的encode和decode误读总结
- Moblin在MID软件系统中扮演三个关键角色........
- php 数组作用域,如何在php中访问私有作用域命名空间数组数据?
- MATLAB中的转置 和 复数的共轭转置
- vue图片连拼实现gif图效果
- linux永久挂载nas存储,Linux下自动挂载NAS
- 记一个windows预览体验计划0x800bfa07错误问题
- Programming Rust Fast, Safe Systems Development(译) 错误处理(第七章)
- oppok3如何刷机_[oppok3刷机教程]oppok3怎么刷机
- java web atm机_Java项目实现模拟ATM机
- 这10本书,带你了解 ChatGPT 的底层逻辑!
- 基于springboot的支持http接口+dubbo接口的TestNG自动化测试框架
- 经济危机与金融危机的学术解释与通俗到庸俗的解释,包你明白
- 谁能够最终实现超越普通计算机的“量子霸权”
- python朝圣之路-内置函数
热门文章
- cropper:图片裁剪工具
- [Matlab]椭圆滤波器设计:低通、高通、带通和带阻(4)
- 二分法和牛顿迭代法求平方根(Python实现)
- java计算机毕业设计废品回收管理系统设计与实现源码+mysql数据库+系统+lw文档+部署
- 计算机和遥感哪个专业好啊,遥感科学与技术专业毕业是干什么的
- 降龙十八掌-程序员篇
- phpize使用方法
- 网页底部固定版权信息
- 安卓人脸检测之FaceDetector
- vue 中使用$refs,报this.$refs.xxx.xxx() is not a function