Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
RGR2 saod.docx
Скачиваний:
2
Добавлен:
01.03.2025
Размер:
154.4 Кб
Скачать

Алгоритм вставки элемента в 2-3 - дерево

T23_Insert (root, k, data)//

1 k –ключ

2 data - данные

3 root – корень 2-3 дерева

3  Создание узла листа с ключом  k и данными data - lt

4  if дерево пусто

5    then создание внутреннего узла - корня - root

6            son1[root] ← lt

7            return TRUE

8   if корень имеет одного сына

9       then  if key[son1] < k

10                then прикрепить узел lt вторым сыном корня root

11                        return TRUE

12                else if key[son1] > k

13                           then  прикрепить узел lt первым сыном корня root

14                                    return TRUE

15                           else k совпадает с key[son1]

16                                   уничтожить узел - лист lt

17                                   return FALSE

18 корень root имеет 2 и 3 сына

19  inserted ← Insert1(root, lt, tbk, lbk)

20  if inserted = TRUE                вставка произошла

21     then  if tbk ≠ nil                у корня создан новый брат tbk

22                then  создание нового корня  root1

23                         son1[root1] ← старый корень  root

24                         son2[root1] ← tbk

25                         назначить root1 новым корнем дерева

26  return inserted

 

T23_Insert1(t, lt, tnew, low)

1 t – текущий узел 2-3 дерева

2 lt – новый узел

3 tnew – возвращаемый адрес нового узла - брата узла t

4 low – возвращаемый минимальный ключ в поддереве нового узла tnew

tnew ← nil

6  if t - лист

7             then  if key[t] = key [lt]

8                          then return FALSE

9             else tnewt или lt с большим ключом

10                   low ← больший из key[t] и key[lt]

11                   return TRUE

12 t - внутренний узел

13 выбрать w – сына t узла для вставки lt

14 inserted ← T23_Insert1(w, lt, tbk, lbk)

15 if  inserted = TRUE and tbk ≠ nil

16   then вставка tbk среди сыновей узла t, справа от w

17           if t имеет 4 сына

18             then создание нового внутреннего узла tnew

19                     перенос двух правых сыновей из t в tnew

20                     low ← минимальный ключ первого сына tnew

21 return inserted

 

Удаление элемента из 2 – 3 дерева

Если при удалении узла  x  у родителя - у  останется один сын и узел у  является корнем, то родитель удаляется из дерева, а корнем становится его единственный сын. Пусть родитель не является корнем. Тогда, если братья узла у имеют трех сыновей, то один из этих сыновей передаются узлу у, и у него становится двое сыновей. Если братья имеют двух сыновей, то единственный сын узла у  передается одному из братьев в качестве третьего сына. Узел у после этого удаляется. Если после этого у родителя удаленного узла у  останется один сын, то процесс перестройки повторяется для него.

 

Алгоритм удаления элемента из 2-3 - дерева

T23_ Delete (root, k)

if дерево пусто

2       then return FALSE

3  if корень имеет одного сына

4       then if key[son1[root]] = k

5                   then уничтожение первого сына корня

6                           уничтожение корня

7                           root ← nil

8                           return TRUE

9                   else return FALSE

10 deleted ← T23_Delete1(root, k, tmin, one)

11 if deleted = TRUE

12      then if one = TRUE

13             корень остался с одним сыном

14                      then if son1[root] не лист

15                                    then уничтожение корня root

16                                            назначение son1[root] корнем дерева

17      else if tmin nil                  tmin - лист с минимальным ключом в поддереве

18                     then корректировка границ поиска в корне - low2[root] или low3[root]

19 return deleted

 

T23_Delete(t, k, tmin, one )

1 t – текущий узел рекурсии 

2 k – ключ  удаляемого узла

3 tmin - возвращаемый адрес листа с минимальным ключом в поддереве

4 one - возвращаемый признак узла с одним сыном

tmin ← nil

one ← FALSE

7 if сыновья  узла t листья

8     then if t имеет сына с ключом  k

9                 then удаление сына с ключом k

10                        tmin ←адрес первого сына узла t

11                        if t имеет одного сына

12                            then one←TRUE

13                            else one← FALSE

14                        return TRUE

15               else return FALSE

16 t – внутренний узел, сыновья которого - не листья

17 выбрать wсына узла t

18 deleted ← T23_Delete(w, k, tmin_bk, one_bk) = FALSE

19 if deleted = TRUE

20     then

21             tmin tmin_bk

22             if tmin_bknil и wвторой или третий сын узла t

23                 then корректировка low2[t] или low3[t] соответственно

24                          tmin nil

25             if one_bk = TRUE

26                then  w остался с одним сыном

27                      if w – первый сын узла t

28                         then if y – второй сын узла t имеет 3-х сыновей

29                                       then 1-й сын y делается 2-м сыном узла w

30                                       else сын узла w делается 1-м сыном узла y

31                                               удаление узла w из сыновей узла t

32                                               if t имеет одного сына

33                                                   then one ← TRUE

34                                                   else one ← FALSE

35                      if w второй сын узла t

36                              then if y – первый сын узла t имеет 3-х сыновей

37                                          then 3-й сын узла y делается 1-м сыном узла w

38                                                  one FALSE

39                                       if z – третий сын узла t имеет 3-х сыновей

40                                          then 1-й сын узла z делается 2-м сыном узла w

41                                                   one FALSE

42                                       первый и третий сыновья узла t имеют 2-х сыновей

43                                       сын узла w делается 3-м сыном первого сына узла t-y

44                                       удаление w из сыновей узла t

45                                       if t имеет одного сына

46                                            then one ← TRUE

47                                            else one ← FALSE

48                      wтретий сын узла t

49                      one FALSE

50                      if y – второй сын узла t имеет 3-х сыновей

51                            then 3-й сын узла y делается 1-м сыном узла w

52                            else    узел y имеет 2-х сыновей

53                                      сын w делается 3-м сыном узла у

54                                      удаление w из сыновей

55 return deleted

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]