B B

В RB: 3-узел

B R

 

R R B B

 

3в)

3 4

В 2-3-4:

4 2 2

 

B B 4-узел

В RB:

R B R R

R R B B

 

3с) 3 4

 

В 2-3-4 4 2 2

 

В RB: 3-узел

B B B

 

4-узел R разделение 4-узла R 3-узел R R

 

B R 3 B B

R R 1 B 2 B

 

 

3d) 3 4

 

В 2-3-4: 4

 

В RB: B разделение B B B

4-узла

R R R R R

 

B R R B B B

 

R R B B B

 

Два последних случая 3с) и 3d) отличительны тем, что 4-узел подключен к красному узлу

3-узла. Разделение 4-узла приводит к образованию двух 2-узлов и на более высоком уровне – к образованию структуры 3-узла. В дереве образуются две последовательные R-связи, что не может быть 2-3-4 –деревом.

Можно преобразовать такое неправильное дерево так, чтобы эти две связи вели из одного узла, что соответствует 4-узлу, путем вращений.

Если две последовательные R-связи ориентированы одинаково (3с), то выполняем ротацию корня неправильного дерева и изменяем цвета узлов.

Если две R-связи ориентированы по-разному (3d), то сначала путем ротации верхнего R-узла сводим связи к одинаковой ориентации, а затем выполняем ротацию, аналогичную случаю 3с).

Для реализации RB-дерева в структуру узла вводим дополнительный параметр – цвет color, который может быть равен RED(1) или BLACK(0) и вспомогательную функцию проверки цвета узла.

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

Red(t)

1 t-узел RB-дерева

2 if t=nil then return BLACK

3 return color(t)

Главная функция вставки в RB-дерево выглядит так:

RB_Insert(t, x)

1 t-корень RB-дерева

2 x-новый узел

3 t RB_Insert1(t, x,0)

4 color [t] BLACK

5 return t

Вызов этой функции: root RB_Insert(root, x)

RB_Insert1(t, x,s)

1 t-корень дерева/поддерева

2 x-новый узел

3 s - тип родителя(левый-0/правый-1)

4 if t=nil then color[x] RED

5 return x

6 if Red(left[t]) & Red(right[t])

7 then разделение

8 color[t] RED

9 color[left[t]] color[right[t]] BLACK

10 if key[x]<key[t] R(t)

11 then left[t] RB_Insert1(left[t],x,0) R t R

12 if Red(t) & Red(left[t]) & s=1

13 then t R(t) R R t

14 if Red(left[t]) & Red(left[left[t]]) R(t)

15 then t R(t) t R

16 color[t] BLACK left[t]

17 color[right[t]] RED R B

18 else right[t] RB_Insert1(right[t],x,1)

19 if Red(t) & Red(right[t]) & s=0 B R R t

20 then t L(t)

21 if Red(right[t]) & Red(right[right[t]]) L(t)

22 then t L(t) R t R

23 color[t] BLACK

24 color[left[t]] RED R t R

25 return t B t

 

R B

 

R t R R

 

Рассмотрим, как строится RB-дерево при последовательном включении элементов.

 

RB-дерево 2-3-4 - дерево

 

1 1 1

 

19 1

1 19

19

1 1 5

5

1 5 19

5 19

5 R 5 5

 

1 19

 

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