今天把這編部落格寫完吧,這裡學習紅黑樹的刪除操作,前面學習了
紅黑樹的定義及旋轉
紅黑樹的插入操作
紅黑樹的刪除操作也要結合二叉查詢樹的刪除操作來學習。
在一棵n個結點的紅黑樹中刪除乙個結點也是一樣的,要花o(lgn)的時間,刪除操作比插入還要複雜!!!!
刪除也分為兩步:第一步,當成二叉查詢樹處理,刪除乙個結點;第二步,修復紅黑樹的性質;
1
ifleft[z] = nil[t] or
right[z] = nil[t]
2then y ← z
3else y ← tree-successor(z)
4ifleft[y] ≠ nil[t]
5then x ← left[y]
6else x ← right[y]
7 p[x] ← p[y]
8if p[y] = nil[t]
9then root[t] ← x
10else
if y = left[p[y]]
11then
left[p[y]] ← x
12else
right[p[y]] ← x
13if y ≠ z
14then key[z] ← key[y]
15 copy y's satellite data into z
16if color[y] = black
17then rb-delete-fixup(t, x)
18 return y
額,又是這麼高大上的演算法,這裡比tree-delete演算法多了16, 17行。若刪除的結點y是黑色的,則要保持紅黑樹的性質;若刪除的結點y是紅色的,則y被刪除後,紅黑性質仍然保持,理由如下:
1. 樹中各結點的黑高度都沒有變化
2. 不存在兩個相鄰的紅色結點
3. 若y是紅色的,就不肯是根,所以根依然是黑色的。
『
這裡寫**片
「修復情況看起來有些複雜,下面我們用乙個分析技巧:我們從被刪節點後來頂替它的那個節點開始調整,並認為它有額外的一重黑色。這裡額外一重黑色是什麼意思呢,我們不是把紅黑樹的節點加上除紅與黑的另一種顏色,這裡只是一種假設,我們認為我們當前指向它,因此空有額外一種黑色,可以認為它的黑色是從它的父節點被刪除後繼承給它的,它現在可以容納兩種顏色,如果它原來是紅色,那麼現在是紅+黑,如果原來是黑色,那麼它現在的顏色是黑+黑。有了這重額外的黑色,原紅黑樹性質5就能保持不變。現在只要恢復其它性質就可以了,做法還是盡量向根移動和窮舉所有可能性。」–saturnman。
未完待續!!!
多謝!
演算法導論 第13章 紅黑樹
特點 1 每個節點的顏色或是紅,或是黑 2 根節點是黑色 3 葉節點是黑色 4 如果乙個節點是紅色,則葉子為黑 5 對每個節點,從該節點 紅黑樹插入流程 第一步 和bst的插入過程相似,將待插入節點z插入到乙個紅黑樹的葉子節點,並著紅色 因為第一步之後可能會違反紅黑樹的某些性質,所以要進行下一步 第...
演算法導論 13章 紅黑樹
1,每個節點非黑即紅。2,根節點是黑色的。3,葉節點 nil 是黑色的。4,紅節點的兩個孩子都是黑色的。5,對每個節點,從該節點到其所有後代的簡單路徑上,均包含了同樣數目的黑節點。為了維持紅黑樹的性質,要改變某些節點的顏色和指標結構,旋轉改變了指標結構。左旋 以x和y之間的鏈為 支軸 進行的,使得x...
《演算法導論》筆記 第13章 13 1 紅黑樹的性質
紅黑樹中每個結點包含五個域 color,key,left,right和p。如果某結點沒有乙個子結點或父結點,則該域指向nil。我們把nil視為二叉樹的外結點 葉子 而帶關鍵字的結點視為內結點。一棵二叉樹如果滿足下面的紅黑性質,則為一棵紅黑樹 1 每個結點或是紅的,或是黑的。2 根結點是黑的。3 每個...