能够自平衡的【红黑树】,必知必会

红黑树

红黑树(英语:Red–black tree)是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。它是在1972年由鲁道夫·贝尔发明的,他称之为”对称二叉B树”,它现代的名字是在Leo J. Guibas和Robert Sedgewick于1978年写的一篇论文中获得的。它是复杂的,但它的操作有着良好的最坏情况运行时间,并且在实践中是高效的:它可以在 O(logn)时间内做查找,插入和删除,这里的n是树中元素的数目,摘自:维基百科-红黑树。

特点(需要满足的规则)

  1. 每个节点非红即黑;
  2. 根节点总是黑色的;
  3. 每个叶子节点都是黑色的空节点(NIL节点);
  4. 如果节点是红色的,则它的子节点必须是黑色的(反之不一定);
  5. 从根节点到叶节点或空子节点的每条路径,必须包含相同数目的黑色节点(即相同的黑色高度)

例如:

在我看来:

  1. 除开NIL结点,看图的颜色,不难发现从root开始黑红交替;
  2. 只有在叶子结点和NIL结点可能出现两个黑色结点,除开这种,没有连续的红(黑)结点连续。

红黑树的修正

详细了解

1. 变色

变色仅仅指的是红黑树节点的变色。因为红黑树节点必须是【红】或者【黑】这两中颜色,所以变色只是将当前的节点颜色进行变化,以满足特性(2,3,4,5)。

2. 旋转

旋转分左旋和右旋。图片一看就懂。

  1. 左旋
  2. 右旋

应用

TreeMap、TreeSet以及JDK1.8之后的HashMap底层都用到了红黑树。

推荐阅读

  1. 漫画:什么是红黑树?(墙裂推荐,也讲到了平衡二叉树)
  2. 红黑树深入剖析及Java实现(美团点评技术部门)

谢谢阅读!

原文地址:https://www.cnblogs.com/yanshanbei/p/11610410.html

时间: 2024-10-08 18:13:46

能够自平衡的【红黑树】,必知必会的相关文章

平衡搜索树--红黑树 RBTree

红黑树是一棵二叉搜索树,它在每个节点上增加了一个存储位来表示节点的颜色,可以是Red或Black. 通过对任何一条从根到叶子节点简单路径上的颜色来约束树的高度,红黑树保证最长路径不超过最短路径的两倍,因而近似于平衡. 红黑树是满足下面红黑性质的二叉搜索树: 1. 每个节点,不是红色就是黑色的 2. 根节点是黑色的 3. 如果一个节点是红色的,则它的两个子节点是黑色的(不存在连续的红色节点) 4. 对每个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点. 思考:为什么满足上面

必知必会的冒泡排序和快速排序

前一篇给大家介绍了<优化的直接插入排序(二分查找插入排序,希尔排序)>,现在继续介绍其他排序算法 本博文介绍两个最常被提起的排序算法:冒泡排序和快速排序.冒泡排序是入门排序算法,思路比较常规,但确是最耗时的排序算法,所以听到冒泡排序笑一笑就好了,千万不要拿来装B.另一个是被誉为“20世纪最伟大的十大经典算法”的快速排序,以及针对数组特征进行优化的“随机快排”和“平衡快排”. 冒泡排序 (一)概念及实现 冒泡排序的原理:重复的遍历要排序的数组,每次遍历过程中从头至尾比较两个相邻的元素,若顺序错误

深入理解Kafka必知必会(2)

深入理解Kafka必知必会(1) Kafka目前有哪些内部topic,它们都有什么特征?各自的作用又是什么? __consumer_offsets:作用是保存 Kafka 消费者的位移信息 __transaction_state:用来存储事务日志消息 优先副本是什么?它有什么特殊的作用? 所谓的优先副本是指在AR集合列表中的第一个副本. 理想情况下,优先副本就是该分区的leader 副本,所以也可以称之为 preferred leader.Kafka 要确保所有主题的优先副本在 Kafka 集群

MySQL必知必会 学习笔记(一)

第一章  了解SQL 模式:   关于数据库和表的布局以及特性的信息.[描述表可以存储什么样的数据,数据如何分解,各部分信息如何命名等等,可以用来描述数据库中特定的表以及整个数据库(和其中表的关系)]. 第二章 MySQL简介 MySQL是一种DBMS,即它是一种数据库软件.基于客户机----服务器的数据库. MySQL工具: 1.mysql 命令行实用程序 2.MySQL Administrator 3.MySQL query Browser 第四章 检索数据 LIMIT 5 表示MySQL返

mysql 必知必会总结

以前 mysql 用的不是很多, 2 天看了一遍 mysql 必知必会又复习了一下基础.  200 页的书,很快就能看完, 大部分知识比较基础, 但还是了解了一些以前不知道的知识点.自己做一个备份,随时查看. 命令:sql 不区分大小写,语句大写,列.表名小写是一种习惯连接命令:mysql -u user_name –h example.mysql.alibabalabs.com –P3306 –pxxxxquithelp show; // 查看所有 show 命令show databases;

JSON必知必会学习总结(一)

七月第一周,从学校毕业回来上班的第一周.离开一段时候后,再次回来重新工作,有了很多新的认识,不再是实习时那么混混沌沌了.每天我自己该做什么,怎么做,做到什么程度更清晰了.除了要去完成我负责的工作,我开始去想除了完成工作我要从中获得什么. 今天早晨走的时候,随手塞包里一本薄薄的书--<JSON必知必会>,白天间隙的时候看了前两章,这两章设计的内容平时基本接触过,但是没有系统的总结过,看完之后清晰了很多. 首先,JSON是什么,这本书是说JSON是一种数据交换格式,被许多系统用于数据交换. 数据交

SQLServer:《SQL必知必会》一书的读书笔记(五)

第5课 高级数据过滤 5.1 组合 WHERE 子句 第4课介绍的 WHERE 子句在过滤数据时都是用单一的条件. 5.1.1 AND 操作符 检索由供应商 DLL01 制造且价格小于等于 4 美元的所有产品的名称和价格: SELECT prod_id, prod_price, prod_name FROM Products WHERE vend_id = 'DLL01' AND prod_price <= 4; 5.1.2 OR 操作符 检索任一个指定供应商制造的所有产品的名称和价格: SEL

.NET程序员项目开发必知必会—Dev环境中的集成测试用例执行时上下文环境检查(实战)

Microsoft.NET 解决方案,项目开发必知必会. 从这篇文章开始我将分享一系列我认为在实际工作中很有必要的一些.NET项目开发的核心技术点,所以我称为必知必会.尽管这一些列是使用.NET/C#来展现,但是同样适用于其他类似的OO技术平台,这些技术点可能称不上完整的技术,但是它是经验的总结,是掉过多少坑之后的觉醒,所以有必要花几分钟时间记住它,在真实的项目开发中你就知道是多么的有帮助.好了,废话不说了,进入主题. 我们在开发服务时为了调试方便会在本地进行一个基本的模块测试,你也可以认为是集

《MySQL必知必会》读书笔记_4

PS:一个实际的存储过程案例 CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_delete_article_by_id`(IN `id` int) BEGIN #Routine body goes here... DECLARE temp INT; SET @aid = id; SELECT COUNT(*) FROM gk_reply_article WHERE a_id = @aid INTO temp; IF(temp <> 0) THEN

移动前端开发人员必知必会:移动设备概述

因为工作岗位的变换带来工作内容的变动,对于移动网站的前端开发已经疏远了好几个月,在这好几个月中有很多新的东西出现,自己所掌握的一些东西也已经陈旧,所以选择了这本书<HTML5触摸界面设计与开发>来系统地学习和整理一下关于移动网站前端开发的知识体系. 之所以选择这本书,一是因为这本书比较新,2014年04月发的第一版.其二是因为作者Stephen Woods,这是Flickr团队的资深前端,Yahoo主页的Javascript技术平台正是出自此人之手. 接下来的时间里会陆续上传关于这本书学习的一