红黑树详细介绍

本文主要摘抄于清华大学邓俊辉的数据结构视频


特点:任何一次动态操作引发的结构变化量不致超过O(1)。

构成:

由红黑两类节点组成的BST(统一增设外部节点NULL,使之成为真二叉树)

(1)      树根:必为黑色

(2)      外部节点:均为黑色

(3)      其余节点:若为红,则只能有黑孩子

(4)      外部节点到根:途中黑节点数目相等

 

 

提升各红节点,使之与其(黑)父亲等高-------于是每棵红黑树,都对应一颗(2, 4)B-树

将黑节点与其红节点视作(关键码合并为)超级节点

无非四种组合,分别对应4阶B-树的一类内部节点。

                                              

 

1] 插入算法

现拟插入关键码e(不妨设T中本不含e),按BST的常规算法插入之(x=insert(e)必为末端节点)。不妨设x的父亲p=x->parent存在(否则即平凡的首次插入)。将x染红(除非它是根),条件1+2+4依然满足;但3不见得,分两种情况。

                                                                                                           

 

对双红缺陷的讨论: x的祖父g,p的兄弟u,x的父亲p

1)      当u的颜色为黑色,则x, p, g的四个孩子(可能为外部节点)全为黑,且黑高度相同。另两种对称情况自行补充。

                                                                   

可参照AVL树算法,做全局3+4重构,将节点x,p,g及其四棵子树,按中序组合为T0<a<T1<b<T2<c<T3,染色:将b转黑,a或c转红。

                                                                                                                   

 

2)      当u为红色时,在B-树中,等效于超级节点发生上溢(另两种对称情况请自行补充)。

                                             

在红黑树角度相当于p与u转黑,g转红。在B-树中,等效于节点分裂,关键码g上升一层。    

                                                         

 

总结:

重构、染色均属常数时间的局部操作,故只需统计其总次数。

红黑树的每一次插入操作都可在O(logn)时间内完成。

其中至多做:1. O(logn)次节点染色    2.一次“3+4”重构。


                                                                        

 

  

2] 删除算法

首先按照BST常规算法,执行r=removeAt(x,_hot),x由孩子r接替(另一孩子记做W,即黑的NULL),条件1和2依然满足,但3和4不见得。考察xr,若二者之一为红,则34不难满足。

                                                         


对双黑缺陷的讨论:(x与r均为黑色)

p为删除节点的父亲,r为删除节点的孩子,替代s删除节点的位置,s为新树中的r的兄弟。

1)s为黑,且至少有一个红孩子t。

方法:

3+4重构:t、s、p重命名为a,b,c

r保持黑;a和c染黑;b继承p的颜色。

                                                           

思考过程如下:


2)  s为黑,且两个孩子均为黑;p为红

r保持黑;s转红;p转黑

合并之前,在p之左或右侧还应有问号关键码,必为黑色,有且仅有一个

                                                          


3)  s为黑色,且两个孩子均为黑;p为黑

会发生不断下溢情况。


4)  s为红色(其孩子均为黑)

红s转黑,黑p转红,黑高度依然异常,但r拥有了一个新黑兄弟,转为前述情况1),2)。经过一轮调整便可全局恢复。



总结:

红黑树的每一删除操作都可在O(logn)时间内完成。

其中:至多做

1.       O(logn)次重染色

2.       一次“3+4”重构

3.       一次单旋

                         

                                            



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值