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

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#中的Stream相关

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

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

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

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 trunk(主线) branch(分支) tag(标记) 用法详解和详细操作步骤

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

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

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

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

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

【转】人工智能-1.2.2 神经网络是如何进行预测的

上一篇文章中我们已经知道了如何将数据输入到神经网络中。那么神经网络是如何根据这些数据进行预测的呢&#xff1f;我们将一张图片输入到神经网络中&#xff0c;神经网络是如何预测这张图中是否有猫的呢&#xff1f;&#xff1f; 这个预测的过程其实只是基于一个简单的公式&a…

js 根据公历日期 算出农历_一招教会你公历换算成农历,要不要试试看

古代的历法是干支纪年&#xff0c;俗称农历或阴历&#xff0c;现在我们都统一采用公历的阿拉伯数字纪年。因此&#xff0c;就存在着一个历法的换算问题。当然&#xff0c;我们可以查历书就直接知道了&#xff0c;但是这个方法并不一定方便。现在告诉大家一个简单的口诀&#xf…

【转】Power Platform(简介)

Power Platform 系统通过允许用户执行以下三个关键操作来帮助他们推动业务发展&#xff1a;使用 Power BI 从数据中获得见解&#xff0c;通过使用 PowerApps 构建的应用程序来推动智能业务流程&#xff0c;以及使用 Power Automate 自动执行这些流程。 这些解决方案彼此配合协作…

【转】人工智能-1.2.1 如何将数据输入到神经网络中

1.2.1 如何将数据输入到神经网络中 通过对前面文章的学习&#xff0c;我们已经知道神经网络可以实现真正的人工智能。本小节我会进行详细地讲解&#xff0c;让大家彻底地弄懂神经网络。在仅仅只学完一篇文章后&#xff0c;你肯定依然感觉朦胧&#xff0c;这是正常的&#xff0…

Qt实现多屏幕多分辨率自适应

这里仅大概描述一下实现思路。 运行条件 两个屏幕&#xff0c;分辨率不同。Qt软件 问题提出 前段时间写了一个软件&#xff0c;窗口内有自绘内容。 自绘内容里面用的长度单位都是像素。可想而知&#xff0c;在开发者的电脑屏幕上大小都是符合要求的。到这一步都没问题。 软…

您需要来自pc的权限才能_微信电脑版还是鸡肋吗?微信PC版3.0内测体验

[PConline 应用]微信PC版3.0来了&#xff01;这到底是个怎样的版本&#xff1f;先说结果吧&#xff0c;好消息是微信PC端新版很快就要上线了&#xff0c;坏消息是这一回采用是邀请内测制&#xff0c;注定了很多人只能等到正式上线后&#xff0c;才能见到新版本&#xff01;目前…

【转】【MySQL】事务与锁(四):行锁到底锁住的是什么?记录?字段?索引?

首先我们有三张表t1,t2,t3&#xff0c;它们都是只有两个字段&#xff0c; int类型的id和varchar类型的name&#xff1b;区别是t1没有索引&#xff0c;t2有主键索引&#xff0c;t3有唯一索引。 再强调一次&#xff0c;在实验前必须提前关闭自动提交&#xff0c;set autocommitof…

【编译原理】理解BNF

BNF范式 下面来自百度百科&#xff1a; 巴科斯范式&#xff08;BNF&#xff09;所描述的语法是与上下文无关的。它具有语法简单&#xff0c;表示明确&#xff0c;便于语法分析和编译的特点。 源码解析使用的算法就是BNF或者其改进算法。 什么是上下文无关文法呢&#xff1f; …

【GUI开发】图像处理类软件的浏览功能实现模型

图像处理软件包括但不限于&#xff1a; 图片浏览器&#xff0c;2D地图浏览器、图片编辑器等软件。 为了处理大分辨率图片&#xff0c;一般采用GDAL加载图像&#xff0c;GDAL可以动态加载图像的一部分&#xff0c;可以建立图像金字塔&#xff0c;优化加载速度。 一般的图像处理…

自动事务_JDBC进阶(二)事务编程

一、事务简介事务是用户定义的一个数据库操作序列&#xff0c;这些操作要么全做&#xff0c;要么全不做&#xff0c;是一个不可分割的工作单位。事务具有ACID特性&#xff1a;原子性&#xff08;Atomicity&#xff09; —— 原子性是指事务是一个不可分割的工作单位&#xff0c…

【精华】详解Qt中的内存管理机制

前言 内存管理&#xff0c;是对软件中内存资源的分配与释放进行有效管理的方法和理论。 众所周知&#xff0c;内存管理是软件开发的一个重要的内容。软件规模越大&#xff0c;内存管理可能出现的问题越多。如果像C语言一样手动地管理内存&#xff0c;一会给开发人员带来巨大的…

【转】2.1【MySQL】运行原理(一):查询sql的执行过程及MySQL架构分析

MySQL的发展历史和版本分支&#xff1a; 时间里程碑1996 年MySQL1.0 发布。它的历史可以追溯到 1979 年&#xff0c;作者 Monty 用 BASIC 设计的一个报表工具。1996 年 10 月3.11.1 发布。MySQL 没有 2.x 版本。2000 年ISAM 升级成 MyISAM 引擎。MySQL 开源。2003 年MySQL4.0 …

【转】2.2【MySQL】运行原理(二):InnoDB 内存结构、磁盘结构及update sql执行过程分析

前一篇讲完了查询流程&#xff0c;我们是不是再讲讲更新流程、插入流程和删除流程&#xff1f;在数据库里面&#xff0c;我们说的update操作其实包括了更新、插入和删除。如果大家有看过MyBatis的源码&#xff0c;应该知道Executor里面也只有doQuery()和doUpdate()的方法&#…