红黑树

红黑树图
Java在实现TreeMap中用到了红黑树,在此记录自己的理解。

定义

红黑树是二叉搜索树的一种实现方式,任意一条到叶结点的路径不会比其他路径长出2倍。

性质

红黑树一共有5点性质:

  1. 每个结点是红色或者黑色的
  2. 根结点是黑色的
  3. 叶结点是黑色的
  4. 如果一个结点是红色的,那么它的儿子结点都是黑色的
  5. 每一个结点到其叶结点的所有路径中,黑色结点的个数相同

红黑树的一个结点如果没有儿子,那么它将指向一个NIL结点,该NIL结点为叶结点。同理,根结点的父亲也指向NIL结点。NIL结点为黑色的,其left、right、p、key可以为任何值。

为了便于在红黑树执行增加或删除操作时的边界处理,使用一个哨兵结点T.nil代表NIL。

操作

一个二叉树的基本操作有增加、删除和查询。红黑树的基本操作时间复杂度为O(lgn)。为了保证红黑树进行增加或删除操作后仍然保持其性质,需要在基本操作之后进行处理,使其满足特性。

旋转

旋转是修改红黑树结构的一种方法。


红黑树_旋转.jpg
增加

往红黑树中增加一个结点z,z结点被设为红色,并且占据了原某一叶子结点的位置。由于在加入z结点之前红黑树满足性质,在加入z结点后,树可能不满足的性质为性质4,即出现某一红色结点的儿子仍为红色结点。此时需要处理该红色z结点,主要方法为在满足其余性质的情况下,不断将红色上移(不是移动结点,而是不断更改相邻结点的颜色),直到根结点为红色,将根结点变为黑色或者在某一步上移中,红色移动到了满足所有性质的位置。

当z结点的父亲结点为黑色时,不存在不满足的性质,以下讨论z结点的父亲为红色时的情况。我们不妨另z为其父结点的左儿子,对于z为其父结点右儿子的情况,可以通过旋转将其变为左儿子。


增加_右儿子变左儿子.jpg

假设z.p=z.p.p.left,另一种情况与此相似。此时只需要按照z.p.p.right,即z的叔结点的颜色进行分类讨论即可。

  1. 叔结点为红色


    叔结点为红色.png

将z.p和z.p.p.right变为黑色,将z.p.p变为红色。经过上述操作后,原z结点满足性质4,另z'=z.p.p,继续以处理z的方式处理z'。

  1. 叔结点为黑色


    增加_叔结点是黑色.png

将z.p.p设为红色,将z.p设为黑色,将z.p.p进行左旋转。这里对p结点进行右旋转后,由于q结点不再是z的父辈结点,导致z路径上的黑色结点减少一个,将p变为黑色后满足,此时满足性质4,完成处理。

删除

红黑树的删除基于TRANSPLANT操作,以下为其实现。

RB-TRANSPLANT(T,u,v)
    if(u.p==T.nil)
        T.root=v
    else if u==u.p.left
        u.p.left=v
    else 
        u.p.right=v
    v.p=u.p       

在红黑树上删除一个结点z后,我们用其子树上的y结点连接z的父结点,并将y结点的颜色设为与z结点相同,这里需要分类讨论z的儿子结点个数。

  1. 当左儿子为NIL时,y结点为z的右儿子。


    删除_左左儿子为nil.png
  2. 当右儿子为NIL时,y结点为z的左儿子。


    删除_右儿子为nil.png
  3. 当左、右儿子均不为NIL时,y结点为树中比z结点大的最小结点,即z结点右子树中的最小结点。


    删除_左右儿子非nil.png

在第1或第2的情况下下,如果z结点为黑色,将y放置到z的位置后,y父辈到叶结点的路径上的黑色结点个数减一;或者情况3下y结点为黑色,将y放置到z的位置后,y的右儿子的父辈到叶结点的路径到上的黑色结点个数减一。为了保证红黑树的性质5,我们暂时增加该结点(情况1、2为y结点,情况3为x结点)的“黑色的程度”,即计算路径上的黑色结点时多计算一次该结点的黑色次数。

我们处理该多余黑色次数的主要办法与之前的方法相似,不断将该黑色次数上移,直到遇到一个红色结点,将其变为黑色或将黑色次数上移到根节点再清除。

统一另增加了黑色程度的结点为x,不妨令x=x.p.left,对于x=x.p.right的情况与之相似。

  1. x结点为红色
    只需要将x结点变为黑色,即可使树满足性质5。
  2. x结点为黑色,x兄弟结点w为红色(此时x的父结点为黑色)
    将x.p设为红色,将x兄弟结点w设为黑色,并对x.p进行左旋转,即可通过下面的分类进行处理。


    删除_case2.png
  3. x结点为黑色,x兄弟结点w为黑色,且w的儿子均为黑色
    将x多余的黑色次数上移给x.p,并将w结点设为红色。令x'=x.p,继续循环。


    删除_case3.png
  4. x结点为黑色,x兄弟结点w为黑色,且w左儿子为红色,w右儿子为黑色
    将w设为红色,w左儿子设为黑色,对w进行右旋转,使用下面的分类进行处理。


    删除_case4.png
  5. x结点为黑色,x兄弟结点w为黑色,且w右儿子为红色
  • 若x.p为黑色,x.p左旋转,消除黑色次数


    删除_case5_1.png
  • 若x.p为红色,x.p设为黑色,w设为红色,x.p左旋转,消除黑色次数


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

推荐阅读更多精彩内容

  • 0.目录 1.算法导论的红黑树本质上是2-3-4树 2.红黑树的结构和性质 3.红黑树的插入 4.红黑树的删除 5...
    王侦阅读 2,477评论 1 2
  • 这个周看算法导论,看到红黑树,看的我云里雾里绕啊。虽然最后看懂了,据我估计,要是过一个星期不看保证忘干净,因此决定...
    充满活力的早晨阅读 1,944评论 0 3
  • 写在前面 当在10亿数据进行不到30次比较就能查找到目标时,不禁感叹编程之魅力!人类之伟大呀! —— 学红黑树有感...
    安卓大叔阅读 659,230评论 262 1,258
  • 什么是红黑树? 红黑树是一棵二叉搜索树,它的结点上新增了一个存储位来表示结点的颜色,颜色可以是红或者黑。通过颜色进...
    MccreeFei阅读 533评论 0 0
  • 原文链接 二叉查找树 由于红黑树本质上就是一棵二叉查找树,所以在了解红黑树之前,咱们先来看下二叉查找树。 二叉查找...
    非典型程序员阅读 2,827评论 2 5