本文主要摘抄于清华大学邓俊辉的数据结构视频
特点:任何一次动态操作引发的结构变化量不致超过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不见得。考察x与r,若二者之一为红,则3和4不难满足。
对双黑缺陷的讨论:(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. 一次单旋