从根源上探究红黑树的本质

目录

前言

二叉树

二叉查找树维基百科上的定义图示理解退化

平衡树

AVL树

2-3树基本概念创建2-3树的规则

2-3-4树含义规则插入操作

B树

红黑树简介如何理解红黑树如何保持红黑树的结构左旋原本的状态过程图结束图右旋原先状态图过程图结束图

应用

参考资料


前言

本文主要讲解下最近一直听到的红黑树,看看究竟是什么神仙鬼怪。

二叉树

满足以下两个条件的树就是二叉树:

本身是有序树(若将树中每个结点的各子树看成是从左到右有次序的(即不能互换),则称该树为有序树(Ordered Tree));

树中包含的各个节点的度不能超过 2,即指能是 0、1 或者 2;

简单地理解,二叉树(Binary tree)是每个节点最多只有两个分支(即不存在分支度大于2的节点)的树结构。通常分支被称作“左子树”或“右子树”。


二叉查找树

要了解红黑树之前,免不了先看下二叉查找树是什么。

维基百科上的定义

二叉查找树(英语:Binary Search Tree),也称为二叉搜索树有序二叉树(ordered binary tree)或排序二叉树(sorted binary tree),是指一棵空树或者具有下列性质的二叉树

若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值;

若任意节点的右子树不空,则右子树上所有节点的值均大于或等于它的根节点的值;

任意节点的左、右子树也分别为二叉查找树;

图示理解

下图为查找值为29的节点,有以下步骤:

查看根节点41

因为41> 29 ,所以查看41的左孩子20

因为20 < 29 ,所以查看20的右孩子29,发现其正好是要查看的节点。

Java学习交流群:1106441130  欢迎讨论交流,另外可免费领取一份(Java学习视频,技术文档,电子书籍,面试等资料...)

退化

二叉查找树有个非常严重的问题,如果数据的插入是从大到小插入的,或者是从小到大插入的话,会导致二叉查找树退化成单链表的形式,俗称“瘸子“。

左瘸子:例如,插入数据依次为{5,4,3,2,1}(从大到小),则如下图所示:

右瘸子:例如,插入数据依次为{1,2,3,4,5}(从小到大),则如下图所示:

为了解决该问题,出现了一些解决方法,即平衡,能够使得树趋向平衡,这种自平衡的树叫做平衡树。

平衡树

平衡树(Balance Tree,BT) 指的是,任意节点的子树的高度差都小于等于1。常见的符合平衡树的有AVL树(二叉平衡搜索树),B树(多路平衡搜索树,2-3树,2-3-4树中的一种),红黑树等。

AVL树

AVL树(由发明者Adelson-Velsky 和Landis 的首字母缩写命名),是指任意节点的两个子树的高度差不超过1的平衡树。又称

自平衡二叉搜索树

AVL树能解决上文二叉查找树中的右瘸子问题,例如,插入数据依次为{1,2,3,4,5}(从小到大),则如下图所示:

AVL树会对不符合高度差的结构进行调整,从而使得二叉树趋向平衡


2-3树

基本概念

2-3树,是指每个具有子节点的节点(内部节点,internal node)要么有两个子节点和一个数据元素,要么有三个子节点和两个数据元素的自平衡的树,它的所有叶子节点都具有相同的高度。

简单点讲,2-3树的非叶子节点都具有两个分叉或者三个分叉,所以,称作2叉-3叉树更容易理解。

另外一种说法,具有两个子节点和一个数据元素的节点又称作2节点具有三个子节点和两个数据元素的节点又称作3节点,所以,整棵树叫做2-3树。

所有叶子点都在树的同一层,一样高

性质1. 满足二叉搜索树的性质

性质2. 节点可以存放一个或两个元素

性质3. 每个节点有两个或三个子节点


创建2-3树的规则

插入操作

向2-节点中插入元素


向一颗只含有一个3-节点的树中插入元素


2-3-4树

含义

2节点:包含两个子节点和一个数据元素

3节点:包含三个子节点和一个数据元素

4节点:包含四个子节点和一个数据元素

2-3-4树,它的每个非叶子节点,要么是2节点,要么是3节点,要么是4节点,且可以自平衡,所以称作2-3-4树。


规则

规则1. 加入新节点时,不会往空的位置添加节点,而是添加到最后一个叶子节点上

规则2. 四节点可以被分解三个2-节点组成的树,并且分解后新树的根节点需要向上和父节点融合

插入操作

原本的2-3-4树

对于上图的2-3-4树,插入一个节点17,由于规则1,节点17不会加入节点[16,18,20]的子树,而是与该节点融合。

由于规则2,节点[16,17,18,20]是一个4节点,将该节点进行拆解成新的树,将18作为子树的根节点进行拆分。

此时树暂时失去了平衡,我们需要将拆分后的子树的根节点向上进行融合。

同理可得,由于规则2,节点[6,10,14,18]是一个4节点,将该节点进行拆解成新的树,将14作为子树的根节点进行拆分,完成了2-3-4树的构建。

总结了下插入节点的过程,无非也就为了符合两条规则,那么,2-3树,2-3-4树都有了,那是不是也有2-3-4-5树,2-3-4-5--...-n树的存在呢?事实上是有的,世人把这一类树称为一个名字:B树。

B树

B树,表示的是一类树,它允许一个节点可以有多于两个子节点,同时,也是自平衡的,叶子节点的高度都是相同的。

所以,为了更好地区分一颗B树到底属于哪一类树,我们给它一个新的属性:度(Degree):一个节点能有多少箭头指向其他节点

具有度为3的B树,表示一个节点最多有三个子节点,也就是2-3树的定义。

具有度为4的B树,表示一个节点最多有四个子节点,也就是2-3-4树的定义。

度为4的B树的示例图:


红黑树


简介

R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种特殊的二叉查找树。红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black)。

如何理解红黑树

一个经典的红黑树如下图所示(省略了叶子节点都是黑色的NIL节点)


如图2所示,将该红黑树与上文讲到的2-3-4树对比,是否发现,红黑树就是一个2-3-4树


每个节点或者是黑色,或者是红色。

根节点是黑色

每个叶子节点(NIL)是黑色。[注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!]

如果一个节点是红色的,则它的子节点必须是黑色的。

由于红黑树的每个节点都是由2-3-4树转化而来的,从而红色节点不能连续两个出现,不然会出现4节点的情况,导致违反了规则2。而且红黑树的每一个黑节点都是3节点中的最中间的那个值,或者是2节点中其中一个值。

从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点

原因:红黑树这些黑色节点在2-3-4树中代表的是由1节点的一个2-3-4树,而2-3-4树是同一个子树的深度是相同的,平衡的,所以从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。(如下图所示,蓝色代表是黑色节点)

注意:

特性(3)中的叶子节点,是只为空(NIL或null)的节点。

特性(5),确保没有一条路径会比其他路径长出两倍。因而,红黑树是相对是接近平衡的二叉树。

红黑树虽然本质上是一棵二叉查找树,但它在二叉查找树的基础上增加了着色和相关的性质使得红黑树相对平衡,从而保证了红黑树的查找、插入、删除的时间复杂度最坏为O(log n)

由上面的例子所示,我们只要把红黑树当做是2-3-4树来处理,并且对应的颜色进行改变或者进行左旋右旋的操作,即可达到使得红黑树平衡的目标。

如何保持红黑树的结构

当我们插入一个新的节点的时候,如何保证红黑树的结构依然能够符合上面的五个特性呢?

树的旋转分为左旋和右旋,下面借助图来介绍一下左旋和右旋这两种操作。

左旋

原本的状态


过程图


结束图


如上图所示,当在某个目标结点E上,做左旋操作时,我们假设它的右孩子S不是NIL。左旋以S到E之间的链为“支轴”进行,它使S成为该子树的新根,而S的左孩子则成为E的右孩子。

右旋

原先状态图


过程图


结束图


同左旋类似,当在某个目标结点S上,做右旋操作时,我们假设它的右孩子S不是NIL。左旋以S到E之间的链为“支轴”进行,它使S成为该子树的新根,而S的左孩子则成为E的右孩子。

应用

红黑树的应用比较广泛,主要是用它来存储有序的数据,它的时间复杂度是O(logn),效率非常之高。

例如,Java集合中的TreeSet和TreeMap,C++ STL中的set、map,以及Linux虚拟内存的管理,都是通过红黑树去实现的。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容

  • 0.目录 1.算法导论的红黑树本质上是2-3-4树 2.红黑树的结构和性质 3.红黑树的插入 4.红黑树的删除 5...
    王侦阅读 2,460评论 1 2
  • 前言 前段时间在研究 JDK1.8 的 hashmap 源码,看到 put 方法的插入环节,遇到了红黑树,不得不停...
    Java架构学习者阅读 1,576评论 0 0
  • 1. 介绍 大家都知道二叉树查找树有一个问题,就是容易偏向某一侧,这样就像一个链表结构了,失去了树结构的优点,查找...
    faris_shi阅读 1,734评论 0 4
  • 红黑树 R-B Tree 红黑树是一种平衡二叉查找树。它是为了解决普通二叉查找树在数据更新的过程中,复杂度退化的问...
    jiaji_3740阅读 483评论 1 0
  • 2-3-4 Tree(2-3-4树) 二叉查找树(Binary Search Tree,简称BST)是一棵二叉树,...
    六尺帐篷阅读 84,589评论 20 140