【数据结构】能看懂的红黑树

1 总体逻辑

1.2 二叉树

二叉树中,一个根节点最多有两个子节点。

1.3 二叉排序树 Binary Search Tree

二叉排序树是一个排好序的二叉树。且水平方向来看,总有

左节点 < 右节点

简单记忆其规律,可以在脑海中想象一个大大的小于号:

(图片来自https://icons8.com)

二叉排序树最大的问题就是不平衡。可以先阅读这篇文章:二叉排序树和平衡二叉树。

1.4 红黑树 Black Red Tree

红黑树是二叉排序树的一种。它是为了解决二叉排序树不平衡的问题,以提高增删改查的效率和时间稳定性。说白了,红黑树是为了弥补二叉排序树的缺点而提出的。最近在读Linux相关书籍,了解到Linux CFS进程调度算法就是使用红黑树来组织进程实例的。

红黑树模型,将所有的二叉树节点分为两种颜色,附加上一些基于颜色的限制规则,基于这些规则调整树的结构,即可保持树的平衡。
规则/性质有以下⑤条:

  1. 每个结点要么是红的要么是黑的。
  2. 根结点是黑的。
  3. 每个叶结点(叶结点即指树尾端NIL指针或NULL结点)都是黑的。
  4. 如果一个结点是红的,那么它的两个儿子都是黑的。
  5. 对于任意结点而言,其到叶结点树尾端NIL指针的每条路径都包含相同数目的黑结点。

这五条规则/性质和天书一样,我们应该如何理解?

顺便说一句,直接上来就说⑤个规则,然后堆一堆代码的所谓教程,就是我们熟悉又厌恶的填鸭式教育。

我们下面尽可能从本质上去理解红黑树。


2 优秀资料

  • 清晰理解红黑树的演变—红黑的含义
  • 红黑树动画
  • 快速理解红黑树原理
  • 【力荐】 硬核图解面试最怕的红黑树【建议反复摩擦】

3 个人理解

3.1 2-3树与二叉树

3.2 2-3树与红黑树

红色节点代表了这个节点与父节点组成3节点。
黑色节点代表了这个节点是一个独立的2节点。

2-3树中,3节点用一个圆圈把两个节点圈起来;
在红黑树中,3节点用黑色父节点+红色子节点表示。

所以红黑树的插入,删除操作,原理和2-3树是一样的,只是把画圈的操作改为给节点染色了。
给节点重新染色的过程就是树的深度调整过程。

3.3 举例

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/436890.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【转】C# 数据流详解(FileStream、MemoryStream、NetworkStream等类)

本文章内容主要为数据流及相关辅助类&#xff1a; 流(Stream)、文件流(FileStream)、内存流(MemoryStream)、网络流(NetworkStream)、加密流(CryptoStream)以及文本读写的StreamReader、StreamWriter、用于二进制读写的BinaryReader和BinaryWriter类等。 对FileStream、Memor…

Linux命令英文全拼及含义解释

最近在做Linux开发。不同于使用Windows系统&#xff0c;使用linux开发经常会使用各种命令来和系统交互&#xff0c;特别是在偏嵌入式的环境下&#xff0c;没有GUI&#xff0c;就会更加依赖命令交互。 Linux命令通常是单词缩写&#xff0c;想要更好的记忆这些命令&#xff0c;最…

node工程默认url_node命令行工具之实现项目工程自动初始化的标准流程

一、目的传统的前端项目初始流程一般是这样&#xff1a;可以看出&#xff0c;传统的初始化步骤&#xff0c;花费的时间并不少。而且&#xff0c;人工操作的情况下&#xff0c;总有改漏的情况出现。这个缺点有时很致命。甚至有马大哈&#xff0c;没有更新项目仓库地址&#xff0…

【转】!C#中的Stream相关

计算机文件基本上分为二种&#xff1a;二进制文件和 ASCII&#xff08;也称纯文本文件&#xff09;。图形文件及文字处理程序等计算机程序都属于二进制文件。这些文件含有特殊的格式及计算机代码。ASCII 则是可以用任何文字处理程序阅读的简单文本文件&#xff0c;由一些字符的…

音频帧AVFrame::linesize大于实际值的问题记录

在解析AAC的音频流时&#xff0c;发现AVFrame::linesize[0]大小为8192。 但是AVFrame::nb_samples为1024&#xff0c;AVFrame::format类型为AV_SAMPLE_FMT_FLTP&#xff0c;即每个采样是4字节。 那么此音频帧中的数据应该为4096&#xff0c;和AVFrame::linesize[0]不相等。 …

vscode生成vue模板快捷键_vs code 快速生成vue 模板

1.使用快捷Ctrl Shift P唤出控制台&#xff0c;然后输入snippets并选择。(或 文件>首选项>用户代码片断里面&#xff0c;输入 vue.json &#xff0c;然后回车 )(或 file > Preferences > User Snippets&#xff0c;然后回车)2.接着输入vue&#xff0c;选择vue-ht…

【转】!!c#文件系统操作类继承关系图

自己总结的&#xff0c;给大家参考一下&#xff0c;

FFmpeg资料

ffmpeg内存模型及AVPacket和AVFrame API解释

php elasticsearch 获取索引所有文档_Elasticsearch客户端主要方法的使用规则

安装1.在 composer.json 文件中引入 elasticsearch-php&#xff1a;{ "require": { "elasticsearch/elasticsearch": "~6.0" }}2.用 composer 安装客户端&#xff1a;curl -s http://getcomposer.org/installer | phpphp composer.…

【转】如何用好SVN的Branch

转自&#xff1a; http://www.cnblogs.com/lovebanyi/archive/2012/06/13/2547525.html 在SVN里面我们一般会创建出三个文件夹 Trunk&#xff08;主干&#xff09; Branch&#xff08;分支&#xff09; TAG&#xff08;标签&#xff09; 在我们项目一开始的时候我们会将代码…

python数据爬取并可视化_Python爬取数据并实现可视化代码解析

这次主要是爬了京东上一双鞋的相关评论&#xff1a;将数据保存到excel中并可视化展示相应的信息主要的python代码如下&#xff1a;文件1#将excel中的数据进行读取分析import openpyxlimport matplotlib.pyplot as pit #数据统计用的wkopenpyxl.load_workbook(销售数据.xlsx)she…

【转】SVN trunk(主线) branch(分支) tag(标记) 用法详解和详细操作步骤

转自&#xff1a;https://monday.blog.csdn.net/article/details/51122637 一&#xff1a;使用场景&#xff1a; 假如你的项目&#xff08;这里指的是手机客户端项目&#xff09;的某个版本&#xff08;例如1.0版本&#xff09;已经完成开发、测试并已经上线了&#xff0c;接…

纠正一个可能的错误翻译—交叉编译

交叉编译&#xff0c;是英文 Cross Compilation 的中文翻译。 下面摘自百度&#xff1a; 交叉编译是在一个平台上生成另一个平台上的可执行代码。 由于嵌入式设备的性能局限&#xff0c;往往不能通过本机编译得到所需软件的可执行程序。因此&#xff0c;以Linux为主机操作系统…

jar 退出run_Java终止线程的三种方式

停止一个线程通常意味着在线程处理任务完成之前停掉正在做的操作&#xff0c;也就是放弃当前的操作。在 Java 中有以下 3 种方法可以终止正在运行的线程&#xff1a;使用退出标志&#xff0c;使线程正常退出&#xff0c;也就是当 run() 方法完成后线程中止。使用 stop() 方法强…

【转】人工智能教程-前言

前言 大家好&#xff01;欢迎来到我的网站&#xff01; 人工智能被认为是一种拯救世界、终结世界的技术。毋庸置疑&#xff0c;人工智能时代就要来临了&#xff0c;科幻电影中的场景将成为现实&#xff0c;未来已来&#xff01; 我很庆幸。十四年前就认定了人工智能专业&…

golang 包含 数组_Golang数组类型

数组数组是指一系列同一类型数据的集合。数组中包含的每个数据被称为数组元素(element)&#xff0c;一个数组包含的元素个数被称为数组的长度。1. 声明方法[32]byte //长度为32的数组[2*N] struct {x, y int32} //复杂类型数组[100]*float64 //指针数组[3][5]int //二维数组[2]…

【转】人工智能-1.1.1 什么是神经网络

1.1.1 什么是神经网络 什么是人工智能&#xff1f;通俗来讲&#xff0c;就是让机器能像人一样思考。这个无需解释太多&#xff0c;因为通过各种科幻电影我们已经对人工智能很熟悉了。大家现在感兴趣的应该是——如何实现人工智能&#xff1f; 从1956年夏季首次提出“人工智能…

【V4L2】学习资料

预备知识 V4L2&#xff0c;即Linux视频设备内核驱动。 参考文章 v4l2的学习建议和流程解析Linux V4L2学习高通msm-V4L2-Camera驱动浅析5-buffer00_video_decode (video decode)&#xff1a;此内容为英伟达Jetson的Demo文档手册&#xff0c;有条件的可以结合Jetson的代码阅读…

解决margin塌陷的问题_解决margin塌陷与margin合并(margin)清除浮动问题

**1、margin塌陷**问题&#xff1a;垂直方向的父子关系的盒子使用不当会产生margin塌陷。给子级设置margin-top时&#xff0c;他不会相对父级一起动&#xff0c;只有他的margin超过父级的margin时&#xff0c;才会生效&#xff0c;但会带着父级一起动(作者总结&#xff0c;官方…