五分钟搞懂什么是红黑树(全程图解)

                                                                                                                                                           

红黑树,对很多童鞋来说,是既熟悉又陌生。熟悉是因为在校学习期间,准备面试时,这是重点。然后经过多年的荒废,如今已经忘记的差不多了。如果正在看文章的你,马上快要毕业,面临着找工作的压力;又或者你觉得需要将这块知识重新复习一遍;又或者只是看看,那么恭喜你,赚到了。那么我将带领大家重新认识下红黑树,用简单的语言,搞懂红黑树。

在学习红黑树之前,咱们需要先来理解下二叉查找树(BST)。

要想了解二叉查找树,我们首先看下二叉查找树有哪些特性呢?

1, 左子树上所有的节点的值均小于或等于他的根节点的值

2, 右子数上所有的节点的值均大于或等于他的根节点的值

3, 左右子树也一定分别为二叉排序树

我们来看下图的这棵树,他就是典型的二叉查找树

640

那问题来了,为什么一定要这种结构呢?换句话说这样的结构有什么好处呢?我们就来查找下值为10的节点。它怎么一步步的找到这个节点的?步骤是怎样的?接着往下看。

1, 查找到根节点9,看下图:

640

2, 由于10大于9的,所以查找到右孩子13,看下图:

640

3, 又因为10是小与13的,所以查找到左孩子11,看下图:

640

4, 这一步相比不用说了大家也都知道了,找到了左孩子,然后发现正好是10 。恰好是正要寻找的值。

640

可能又有童鞋会问,这不是二分查找的思想吗?确实,查找所需的最大次数等同于二叉查找树的高度。当然在插入节点的时候,也是这种思想,一层一层的找到合适的位置插入。但是二叉查找树有个比较大的缺陷,而且这个缺陷会影响到他的性能。我们先来看下有一种情况的插入操作:

如果初始的二叉查找树只有三个节点,如下图:

640

我们依次插入5个节点:7,6,5,4,3,。看下图插入之后的图:

640

看出来了吗?有没有觉得很别扭,如果根节点足够大,那是不是“左腿”会变的特别长,也就是说查找的性能大打折扣,几乎就是线性查找了。

那有没有好的办法解决这个问题呢?解决这种多次插入新节点而导致的不平衡?这个时候红黑树就登场了。

红黑树就是一种平衡的二叉查找树,说他平衡的意思是他不会变成“瘸子”,左腿特别长或者右腿特别长。除了符合二叉查找树的特性之外,还具体下列的特性:

1. 节点是红色或者黑色

2. 根节点是黑色

3. 每个叶子的节点都是黑色的空节点(NULL)

4. 每个红色节点的两个子节点都是黑色的。

5. 从任意节点到其每个叶子的所有路径都包含相同的黑色节点。

看下图就是一个典型的红黑树:640

很多童鞋又会惊讶了,天啊这个条条框框也太多了吧。没错,正式因为这些规则,才能保证红黑树的自平衡。最长路径不超过最短路径的2倍。

当插入和删除节点,就会对平衡造成破坏,这时候需要对树进行调整,从而重新达到平衡。那什么情况下会破坏红黑树的规则呢?

1,我们看下图:

640

向原来的红黑树插入值为14的新节点,由于父节点15是黑色节点,所以这种情况没有破坏结构,不需要做任何的改变。

2,向原树插入21呢?,看下图:

640

由于父节点22是红色节点,因此这种情况打破了红黑树的规则4,必须作出调整。那么究竟该怎么调整呢?有两种方式【变色】和【旋转】分为【左旋转】和【右旋转】。

【变色】:

为了符合红黑树的规则,会把节点红变黑或者黑变红。下图展示的是红黑树的部分,需要注意节点25并非根节点。因为21和22链接出现红色,不符合规则4,所以把22红变黑:

640

但这样还是不符合规则5,所以需要把25黑变红,看下图:

640

你以为现在结束了?天真,因为25和27又是两个连续的红色节点(规则4),所以需要将27红变黑。

640

终于结束了,都满足规则了,舒服多了。

【左旋转】

也就是逆时针旋转两个节点,使父节点被自己的右孩子取代,而自己成为自己的左孩子,听起来吓死人,直接看图吧:

640

【右旋转】

顺时针旋转两个节点,使得自己的父节点被左孩子取代,而自己成为自己的右孩子,看不懂直接看图吧:

640

看起来这么复杂,到底怎么用呢?确实很复杂,我们讲下典型的例子,大家参考下:

以刚才插入21节点的例子:

640

首先我们需要做的是变色,把节点25以及下方的节点变色:

640

由于17和25是连续的两个红色节点,那么吧节点17变黑吗?这样是不行的,你想这样一来不就打破了规则4了吗,而且根据规则2,也不可能吧13变成红色。变色已经无法解决问题了,所以只能进行旋转了。13当成X,17当成Y,左旋转试试看:

640

640640

由于根节点必须是黑色,所以需要变色,结果如下图:

640

继续,其中有两条路径(17-)8->6->NULL)的黑色节点个数不是3,是4不符合规则。

这个时候需要把13当做X,8当做Y,进行右旋转:

640640640

最后根据规则变色:

640

这样一来,我们终于结束了,经过调整之后符合规则。

那我们费这么大力气,这么复杂,这东西用在哪里,有哪些应用呢?

其实STL中的map就是用的红黑树。

转自:www.360doc.com

总结:

红黑色的大体思想就是上面描述的那样,里面还有很多情况要考虑,本文只是简单的讲述思想,大家有兴趣可以去百度上看各种情况的考虑。谢谢大家的支持!


640?wx_fmt=jpeg

扫码或长按关注

回复「 加群 」进入技术群聊

                                                                                                       

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

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

相关文章

SequenceFile文件

SequenceFile文件是Hadoop用来存储二进制形式的key-value对而设计的一种平面文件(Flat File)。目前,也有不少人在该文件的基础之上提出了一些HDFS中小文件存储的解决方案,他们的基本思路就是将小文件进行合并成一个大文件,同时对这些小文件的…

python去停用词用nltk_使用nltk删除英文停用词

一、概念 首先我们来看一下停用词的概念,然后来介绍使用nltk如何删除英文的停用词: 由于一些常用字或者词使用的频率相当的高,英语中比如a,the, he等,中文中比如:我、它、个等,每个页面几乎都包…

win10右键闪退到桌面_WIN10设置闪退,桌面右键个性化显示设置等均无效

开始菜单点击设置,会报错,详细信息记不清了,提示路径C:\Windows\ImmersiveControlPanel\SystemSettings.exe,使用fix it修复工具无效尝试更新系统,更新至最新版本后仍然存在问题事件管理器中找到了这个错误应用程序名称…

Linux 内核红黑树分析

Android binder 内核实现是用红黑树的,理解红黑树我觉得是每一个Linux er的重中之重,感谢格子森同学的投稿,周末愉快。内核版本为 linux4.2.1 本文主要从红黑树的代码实现入手,来讨论linux内核中是如何实现红黑树的(主要是插入和删…

postgresql数据库安装及简单操作

自从MySQL被Oracle收购以后,PostgreSQL逐渐成为开源关系型数据库的首选。 本文介绍PostgreSQL的安装和基本用法,供初次使用者上手。以下内容基于Debian操作系统,其他操作系统实在没有精力兼顾,但是大部分内容应该普遍适用。 一、安…

python中协程与函数的区别_python 协程与go协程的区别

进程、线程和协程 进程的定义: 进程,是计算机中已运行程序的实体。程序本身只是指令、数据及其组织形式的描述,进程才是程序的真正运行实例。 线程的定义: 操作系统能够进行运算调度的最小单位。它被包含在进程之中,是…

周末随想,野路子

焦虑不知道是不是因为科技太发达的原因,晚上睡觉之前总是要看看手机,现在写公众号之后,也经常有读者问问题,总是担心错过哪条消息,所以时刻想看手机,而且因为太过于焦虑的原因,我把微信设置为静…

appium for java教程_appium自动化测试入门(java版)

1、简述appium 是一个自动化测试开源工具,支持 iOS 平台和 Android 平台上的原生应用,web应用和混合应用。“移动原生应用”是指那些用iOS或者 Android SDK 写的应用(Application简称app)。“移动web应用”是指使用移动浏览器访问的应用(appium支持iOS上…

c语言错误解析-变量声明

问题描述:在vc6syntax error : missing ; before type int main(){ printf("Systembegin\n"); PID_init(); int count0; 如上 在VC中编译c程序,在一个大括号括起的范围内,如果变量声明放在了函数调用的后面,那么编译的…

python 批量处理文件_python批量处理文件或文件夹

# -*- coding: utf-8 -*- import os,shutil import sys import numpy as np ##########批量删除不同文件夹下的同名文件夹############# def arrange_file(dir_path0): for dirpath,dirnames,filenames in os.walk(dir_path0): if my_result in dirpath: # print(dirpath) shut…

sizeof你真的弄明白了吗?

sizeof基础在C语言中,sizeof是一个操作符(operator),而不是函数!其用于判断数据类型或者表达式长度(所占的内存字节数)。其有两种表达形式:(1)sizeof(类型说明…

bat java 启动脚本_bat批处理启动java程序通用脚本

前提:脚本假设需要给脚本传递两个参数,参数最终传给java程序脚本同级目录中classes内存放的是程序运行的classes文件脚本同级目录中lib内存放的是程序运行的jar包非最佳脚本,根据需求自行修改启动脚本:不需要传递参数直接双击打开…

!DOCTYPE 标签是什么

<!DOCTYPE> 标签是什么 DOCTYPE 标签&#xff0c;是html文档的类型声明&#xff08;document type declaration&#xff0c;所谓声明&#xff0c;也就是宣称我他妈是谁&#xff09;&#xff0c;用来告诉浏览器&#xff0c;使用什么样的文档类型定义&#xff08;Document …

一道90%都会做错的指针题

今天&#xff0c;在我们的一个小群里&#xff0c;一个同学发了一道题目给我看&#xff0c;这道题目应该是C语言面试的一股清流了&#xff0c;各种招聘笔试上都可以看到&#xff0c;我试着发到我的大群里去&#xff0c;发现有人对这个理解不是很深刻&#xff0c;所以再发出来&am…

python调用arcgis_arcgis python 调用工具两种两种方法

原博文 2019-09-20 11:26 − arcpy.Select_analysis("p","kk") arcpy.analysis.Select("p","kk1") ... 相关推荐 2019-12-18 20:28 − import time import wmi, zlib def get_cpu_info(): tmpdict {} tmpdict["CpuCores"] …

ibatis mysql 同时删多个表报错_MySQL中Multiple primary key defined报错的解决办法

MySQL中Multiple primary key defined报错的解决办法创建主键可以有两种方式&#xff1a;create table 表名(字段名 类型&#xff0c;字段名 类型&#xff0c;……primary key(name));或者是create table 表名(字段名 类型 primary key&#xff0c;字段名 类型&#xff0c;………

LeetCode 252. Meeting Rooms (会议室)$

Given an array of meeting time intervals consisting of start and end times [[s1,e1],[s2,e2],...] (si < ei), determine if a person could attend all meetings. For example,Given [[0, 30],[5, 10],[15, 20]],return false. 题目标签&#xff1a;sort 这道题目给了…

Android ANR视角InputDispatcher

作者&#xff1a;王小二前言有好多人向我咨询过Input ANR问题&#xff0c;说实话&#xff0c;我也是一直无法彻底的解释清楚&#xff0c;我下决心要彻底搞懂这块知识点。话不多说先上图一个event的正常流程InputReader线程1.InputReader线程一旦发现有新的event&#xff0c;判断…

java redis并发问题_Redis 高并发问题,及解决方案!

(一)redis技术的使用&#xff1a;redis真的是一个很好的技术&#xff0c;它可以很好的在一定程度上解决网站一瞬间的并发量&#xff0c;例如商品抢购秒杀等活动。。。redis之所以能解决高并发的原因是它可以直接访问内存&#xff0c;而以往我们用的是数据库(硬盘),提高了访问效…

oracle中scott/tiger、sys、SYSDBA、system都是什么用

oracle中scott/tiger、sys、SYSDBA、system都是什么用点我&#xff0c;点我~ 点我&#xff0c;点我&#xff0c;Oracle&#xff0c;用户和角色说明~ 转载于:https://www.cnblogs.com/tangshengwei/p/7080956.html