红黑二叉树学习

要学习红黑二叉树,就得先了解二叉树是什么,二叉树是有限个元素得集合,这些元素集合构成树,二叉树允许集合元素个数为0,此时他就是一个空树,对于元素个数大于0的二叉树,它会有一个根节点,剩下下的元素被组成 2个二叉树,分别称为左子树和右子树。二叉树它满足以下两个条件:

1.每个结点他最多有两个子结点

 2、左子节点一定是小于或等于其父节点,右子结点一定是大于或等于其父结点的

对于一系列元素来说,构成一个二叉树,它的形式是多样的 ,只要满足上面条件即可,那么它可能构成一个完整的二叉树,即各个结点和其子节点都存在,也或者它会完全是一个线性的,即根节点是最小值,其左子树为空且树中不存在左子节点 。前者是最优的方案,获取元素平均搜索次数也是最少的,后者和链表是一样的,平均搜索次数是最多的,如果是最后一个值,则需要将整个树的节点都过一遍,无疑这种方式是最耗时的。

为了保证元素在形成树时不会出现后者的这种情况,在原先二叉树的基础上增加了一些条件限制,来对元素的插入或删除时保持树的饱和。红黑二叉树是其中一种,红黑二叉树中对每个结点元素新增了颜色的属性,非黑即红。红黑二叉树不仅要满足二叉树的定义,以下几个条件也需要其满足:

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

(2)根节点是黑色。

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

(4)如果一个节点是红色的,则它的子节点必须是黑色的,也就是说不可能出现两个连续的红色节点,不过两个连续的黑色节点是可能出现的

(5)从任意一个节点到该节点的叶子节点的所有路径上包含相同数目的黑节点。

在构建一个红黑树时,不管是新插入元素还是删除元素都有可能破坏4、5限制条件,所以在我们新增或删除元素节点时,我们需要操作树中的结点,让其结点颜色属性满足4、5限制条件。

新插入的元素结点一定是在红黑树的最低端的,且插入的元素初始颜色属性为红色(为红色在有的情况下不需要调整原树的颜色属性);

了解一下左旋和有旋的概念,后面会用到


左旋



右旋

截的别人的图片,感觉很直观;

在我们插入一个新的元素结点时,我们会遍历树,找到新增结点的插入位置(和二叉树的插入是相同的),插入元素后默认颜色为红色,我们对树做红黑树的限制校验,如果不满足,我们就需要调整树的结点颜色或通过上面说的左旋和右旋来调整结点位置来保证红黑树限制成立,主要有下面的情况

1、新增元素结点是根结点,设置该结点元素为黑色,满足限制条件(2);

2、父结点为黑色,插入结点后不做任何调整(插入结点为红色,满足条件4 ,原先经过父结点的最短简单路径的黑色结点树没有减少或增加,满足条件5,所以不需修改)

3、父结点是红色,此时父节点的兄弟结点(也叫叔叔结点)也是红色,此时爷爷结点一定是黑色的(条件4),这种情况由于新增的结点为红色,不满足条件4,此时需要做调整,将父结点和叔叔结点同时变为黑色,此时经过父结点和叔叔结点的简单路径多了一个黑色结点,不满足条件5,经过父结点和叔叔结点的简单路径肯定经过爷爷结点,且经过爷爷结点的也只有父结点和叔叔结点,所以将爷爷结点变成红色,这样所有简单路径上的黑色结点个数又一致了;此时其实情况又回到了新增结点的最初情况,只不过现在需要判断红黑树限制的结点变成了爷爷结点,将爷爷结点(此时是红色)看做新增结点递归处理

4、父结点是红色,此时叔叔结点是黑色,此时爷爷结点一定也是黑色的(条件4) ,此时情况稍微多点,需要用到左旋和右旋的操作;

情况1、新增红色结点是父结点的左孩子,且父结点也是爷爷的左孩子,此时,不满足条件4,新增结点和父结点都为红色,将父结点修改为黑色,条件4满足,经过父结点的简单路径增加了一个黑色结点,不满足条件5;对爷爷结点做右旋处理,父结点移至爷爷结点变成爷爷结点,爷爷结点移至叔叔结点变成叔叔结点,新增结点移至父结点变成父结点(在树结构中的位置发生变化,我们对其的命名也发生变化,防止后续描述发生歧义)。此时经过爷爷结点的左子树简单路径黑色结点个数减少一个,右子树却新增了一个,将叔叔结点(原爷爷结点元素)变红色,此时叔叔结点的父结点是黑色的,两个子结点也是黑色的,将其变成红色,不违反条件4,又能平衡简单路径的黑色结点树,满足条件5 。

情况2、新增红色结点是父结点的右孩子,且父结点是爷爷结点的左孩子,此时,不满足条件4,新增结点和父结点都为红色。将父结点做左旋处理,就变成了情况1,继续按照情况1的处理方式去调整。

情况3、新增红色结点是父结点的右孩子,且父结点也是爷爷结点的右孩子,此时,不满足条件4,新增结点和父结点都为红色,将父结点修改为黑色,条件4满足,经过父结点的简单路径增加一个黑色结点,不满足条件5;对爷爷结点做左旋处理,父结点移至爷爷结点变成爷爷结点,爷爷结点移至叔叔结点变成叔叔结点,新增结点移至父结点变成父结点(在树结构中的位置发生变化,我们对其的命名也发生变化,防止后续描述发生歧义)。此时经过爷爷结点的右子树简单路径黑色结点个数减少一个,右子树却新增了一个,将叔叔结点(原爷爷结点元素)变红色,此时叔叔结点的父结点是黑色的,两个子结点也是黑色的,将其变成红色,不违反条件4,又能平衡简单路径的黑色结点树,满足条件5 。

情况4、新增红色结点是父结点的左孩子,且父结点是爷爷结点的右孩子,此时,不满足条件4,新增结点和父结点都为红色。将父结点做右旋处理,就变成了情况3,继续按照情况3的处理方式去调整;

以上是红黑树新增结点的处理。

下面来理一理删除:

什么叫后继结点 :后继节点一共有两种情况,一种情况是当前节点有右子树,那么当前节点的后继节点一定在它的右子树上,在右子树的最左边 ,即为右子树的最小值;第二种情况是,当前结点没有右子树,那么就依次往上找,找到一种情况是当前节点是它的父亲节点的左孩子的时候,那么这个父亲节点就是我原始节点的后继节点

红黑树的删除会有以下情况 

1、删除的结点无子结点

2、删除的结点只有左子树或右子树

3、删除的结点左右子树都存在

针对第3种情况,如果左右子树都存在的话,我们会寻找删除结点的后继结点,然后将后继结点的值赋给删除结点,再将后继结点删除,这种情况下的后继结点即为删除结点的右子树的最左边;实际上就是变成了删除后继结点,又变成了第一二种情况,所以实际上就有这两种情况了。

情况1 、 删除的结点无子结点;

        1.1  、删除结点为红色   ,直接删除即可,因为是红色结点,所以不影响红黑树的4和5条件;

        1.2 、删除结点为黑色且为左孩子,兄弟结点为红色,此时父结点为黑色,根据红黑树的性质,兄弟结点的左结点SL和右结点SR都为黑色且不能为空,删除后,父结点修改为红色,兄弟结点修改为黑色,对父结点做左旋处理,SL结点变成了原父结点的右孩子(黑色),原父结点左孩子为空孩子,此条路径会少一个黑色结点,不满足条件5,再对原父结点做左旋处理,SL结点替代原父结点位置即可。

        1.3、删除结点为黑色且为左孩子,兄弟结点为黑色

                1、兄弟结点左孩子SL为红色时 ,删除结点后,左子树减少一个黑色,需要左结点新增个黑色结点,兄弟结点右旋,SL结点代替兄弟结点,将SL修改为父结点的颜色,父节点修改为黑色,对父结点左旋,此时,左子树新增了一个黑色结点,右子树的黑色结点树不变。

                2、兄弟结点右孩子SR为红色时 ,删除结点后,左子树减少一个黑色,需要左结点新增个黑色结点,将兄弟结点由黑色改为父结点的颜色,将SR由红色改为黑色,将父节点的颜色改为黑色,再将父节点左旋转;此时,左子树新增了一个黑色结点,右子树的黑色结点树不变。

                3、兄弟结点的两个孩子都为黑色,父结点为红色,删除结点后,左子树减少一个黑色,需要左结点路径新增个黑色结点,     父结点修改为黑色,再将兄弟结点修改为红色即可。

                4、兄弟结点的两个孩子都为黑色,父结点为黑,删除结点后,左子树减少一个黑色,此种情况下无法通过修改结点颜色属性和旋转来达到左子树增加黑色结点的目的,所以只能将兄弟结点改为红色,将左右子数经过黑色结点树都减1,在对父结点左迭代处理,

        1.4、删除结点为黑色且为右孩子,兄弟结点为红色,此时父结点为黑色,根据红黑树的性质,兄弟结点的左结点SL和右结点SR都为黑色且不能为空,删除后,父结点修改为红色,兄弟结点修改为黑色,对父结点做右旋处理,SR结点变成了原父结点的左孩子(黑色),原父结点右孩子为空孩子,此条路径会少一个黑色结点,不满足条件5,再对原父结点做右旋处理,SR结点替代原父结点位置即可。

    1.5  删除结点为黑色且为右孩子,兄弟结点为黑色

         1、兄弟结点左孩子SR为红色时 ,删除结点后,右子树减少一个黑色,需右结点新增个黑色结点,兄弟结点左旋,SR结点代替兄弟结点,将SR修改为父结点的颜色,父节点修改为黑色,对父结点右旋,此时,右子树新增了一个黑色结点,左子树的黑色结点树不变。

                2、兄弟结点左孩子SL为红色时 ,删除结点后,右子树减少一个黑色,需要右结点新增个黑色结点,将兄弟结点由黑色改为父结点的颜色,将SL由红色改为黑色,将父节点的颜色改为黑色,再将父结点节点右旋转;此时,左子树新增了一个黑色结点,右子树的黑色结点树不变。

            3、兄弟结点的两个孩子都为黑色,父结点为红色,删除结点后,右子树减少一个黑色,需要左结点路径新增个黑色结点,     父结点修改为黑色,再将兄弟结点修改为红色即可。

              4、兄弟结点的两个孩子都为黑色,父结点为黑,删除结点后,右子树减少一个黑色,此种情况下无法通过修改结点颜色属性和旋转来达到右子树增加黑色结点的目的,所以只能将兄弟结点改为红色,将左右子数经过黑色结点树都减1,在对父结点做迭代处理;

1.4和1.5情况差不多,只是做左旋右旋的选择不同


情况2、删除的结点只有一个子结点;

        2.1、删除的结点为红色,用子结点替换掉该要删除的结点,因为是红色结点,所以不影响红黑树的4和5条件;

        2.2 、删除的结点为黑色,用子结点替换掉该要删除的结点,如果子结点为红色时,修改子结点颜色为红色;

        2.3  删除的结点为黑色,用子结点替换掉该要删除的结点,子结点为黑色,处理情况和情况1的1.2、1.3、1.4、1.5情况类似。

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

推荐阅读更多精彩内容

  • 写在前面 当在10亿数据进行不到30次比较就能查找到目标时,不禁感叹编程之魅力!人类之伟大呀! —— 学红黑树有感...
    安卓大叔阅读 657,935评论 262 1,257
  • 0.目录 1.算法导论的红黑树本质上是2-3-4树 2.红黑树的结构和性质 3.红黑树的插入 4.红黑树的删除 5...
    王侦阅读 2,446评论 1 2
  • 转载请注明出处!https://www.jianshu.com/p/d9d9f223f0ad Github源码地址...
    yifyif阅读 4,280评论 0 7
  • 目录 0.树0.1 一般树的定义0.2 二叉树的定义 1.查找树ADT 2.查找树的实现2.1 二叉查找树2.2 ...
    王侦阅读 7,062评论 0 3
  • 今天(10月16日)是世界粮食日。“民以食为天”,粮食在整个国民经济中始终具有不可替代的基础地位。今年粮食日的主题...
    趣读书吧阅读 1,309评论 0 0