1.什麼是紅黑樹
2.紅黑樹的五大性質
這五大性質非常重要,想要明白紅黑樹,這五個性質請大家必須牢記。一棵紅黑樹是滿足下面紅黑性質的二叉搜索樹:
1. 每個節點或是紅色的,或是黑色的
2. 根節點是黑色的
3.每個葉節點(NIL)是黑色的
4.如果一個節點是紅色的,則它的兩個子節點都是黑色的
5.對於每個幾點,從該節點到其所有後代葉節點的簡單路徑上,均包含相同數目的黑色節點。
關於性質一,第一眼看着好像就是廢話沒啥用,其實到了後面刪除操作的時候就看出這個性質是很微妙的。這裏還有兩個概念,一個是哨兵節點,爲了方便處理邊界條件以及方便描述,我們把不需要關注的葉子節點和null節點統一用一個特殊節點表示,我們稱它爲哨兵節點,記爲T.NIL。一個是黑高,從某個節點x出發(不含該節點)達到一個葉節點的任意一條簡單路徑上的黑色節點個數稱爲該節點的黑高。下面展示一棵普通的紅黑樹:
3.旋轉操作
// 以節點b爲中心左旋轉
LEFT-ROTATE(T, b)
a = b.right;
// 把右孩子a的左孩子給節點b做右孩子
b.right = a.left;
if a.left != T.NIL
a.left.p = b;
a.p = b.p;
if b.p == T.NIL
T.rooot = a;
else if b == b.p.left
b.p.left = a;
else b.p.right = a;
a.left = b;
b.p = a;
4.子樹移植
//用以v爲根的子樹替代以U爲根的子樹
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.parent=u.parent
5.找出最小節點
紅黑樹刪除的時候需要用到,如果被刪除節點有雙非空子樹,找出該節點的後繼節點
TREE-MINIMUM(x)
while x.left != T.NIL
x = x.left;
return x;