
32. Удаление вершины в красно – черном дереве.
Удаление из RB-дерева также требует O(log n)времени. Удаление вершины несколько сложнее добавления. Для упрощения удаления в дереве используется вместо значения NIL фиктивные элементы nil[T]. Более того, физически в дереве присутствует один фиктивный элемент, на который ссылаются все листья дерева и узлы, имеющие одного сына. Фиктивный элемент имеет поля : p, left, right, key и color, причем в алгоритмах играют роль только поля p и color. Цвет фиктивного элемента всегда черный.
Операция RB_Delete вырезав вершину, вызывает вспомогательную операцию RB_FixUp, которая перекрашивает узлы или производит вращения для восстановления RB-свойств после удаления узла. Эта операция используется, если вырезан черный узел.
RB_Delete (T, z)
1.if left[x] = nil [T] or right[T] = nil [T]
2.then y ← 2
3.else y ← Tree_Successor (z)
4.if left [y] ≠ nil [T]
5.then x ← left [y]
6.else x ← right [y]
7.p [x] ← p[y] вырезание, в фиктивный элемент записывается родитель у
8.if p [y] = nil
9.then root [T] ← x
10.else if y = left [p[y]]
11.then left [p [y]] ← x
12.else right [p[y]] ← x
13.if y ≠ z
14.then key [z] ← key [y]
15.копируем дополнительные данные из вершины у
16.if color [y] = BLACK
17.then RB_FixUp (T, x)
18.return y
19.
RB_FixUp (T, x)
1.while x ≠ root [T] and color [x] = BLACK
2.dv if x = left [p[x]]
3.then w ← right [p[x]]
4. if color [w] = RED |
случай 2 |
5.then color [w] ← BLACK
6.color [p[x]] ← RED
7.Left_Rotate (T, p[x])
8.w ← right [p[x]]
9.if color [left [w]] = BLACK and color [right [w]] = BLACK
10. |
then color [w] ←RED |
случай 1 |
|
11. |
x ← p[x] |
|
|
12. |
else if color [right [w]] = BLACK |
случай 3 |
13.then color [left [w]] ← BLACK
14.color [w] ← RED
15.Right_Rotate (T, w)
16.w ← right [p[x]]
17. color [w] ← color [p[x]] |
случай 4 |
18.color [p[x]] ← BLACK
19.color [right [w]] ← BLACK
20.Left_Rotate [T, p[x]]
21.x ← root [T]
22.else (симметричный фрагмент с заменой left на right)
23.color [x] ← BLACK
Операция RB_Delete выполняется за O(log n). Обычно производится не более трех вращений.