18 18

 

3 5 5

 

1

 

3 18

 

5 5 5

8

18 19

 

3

8

 

 

1

 

3 8 19

9

 

14

1

 

 

9 8 14

 

14

 

 

1

 

84 19

 

8

7

 

24 9 R 9 9

5

 

9 24

 

 

Алгоритм вставки в красно-черное дерево гарантирует логарифмическую эффективность для поисков и включений. В худшем случае, когда путь поиска состоит из чередующихся 3- и

4-узлов, требуется 2logn+2 шагов. Анализ и моделирование RB-деревьев с n узлами, построенных из случайных ключей, показали, что эффективность имеет оценку 1.002logn. В этом смысле RB-деревья оптимальны для практического применения и часто включаются в библиотеки. При реализации алгоритма часто используется альтернативный подход при рассмотрении RB-дерева, как дерева с определенными структурными свойствами. При этом игнорируется соответствие с 2-3-4- деревом.

RB-дерево, как структура обладает следующими RB-свойствами:

1)  Каждый узел либо красный, либо черный.

2)  Каждый лист – черный.

3)  Если узел красный, то оба его сына – черные.

4)  Все пути, ведущие вниз от корня к листьям, содержат одинаковое количество черных узлов, то есть все пути имеют одинаковую черную высоту.

НЕ нашли? Не то? Что вы ищете?

5)  Корень – черный.

Вставка и удаление из RB-дерева могут нарушать 3) и 4) свойства дерева. В этом случае используется балансировка, заключающаяся в восстановлении RB-свойств на пути поиска узла. Восстановление сводится к восходящей перекраске узлов и ротациям.

Рассмотрим реализацию алгоритмов вставки и удаления узлов в итеративном алгоритме (Кормен, Лейзерсон…).

Поскольку управление стеком в RB-дереве становится довольно сложным, то вместо стека введем в структуру каждого узла указатель на родителя. Итак, узел RB-дерева содержит помимо данных 3 указателя на сыновей и родителя (p[t]) и цвет color[t].

В связи с введением дополнительного указателя p[t], перепишем операцию ротации узла.

It_L(t, x)

1 t – корень дерева

2 x – вращаемый узел дерева x y

3 y right[x]

4 right[x] left[y] 1 y x 3

5 if left[y]=nil

6 then p[left[y]] x

7 p[y] p[x]

8 if p[x]=nil

9 then t y

10 else if x=left[p[x]]

11 then left[p[x]] y

12 else right[p[x]] y

13 left[y] x

14 p[x] y

ВКЛЮЧЕНИЕ В RB – ДЕРЕВО

Новый узел включается в дерево как красный лист. Ссылка nil всегда считается черным псевдолистом. Часто для удобства программирования nil заменяется ссылкой на общий для всех фиктивный черный узел-лист.

При вставке может быть нарушено третье свойство RB-дерева и требуется балансировка для восстановления свойства. При этом возможны три случая конфигурации дерева в области включения нового элемента x.

Случай 1

B

перекраска

R B

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4