Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

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

Задание к лабораторной работе | Структуры сбалансированных деревьев | Задание к лабораторной работе | Методические указания к выполнению задания | Функции хеширования | Разрешение коллизий и структуры хеш-таблиц | Задание к лабораторной работе | Методические указания к выполнению задания | Алгоритм пирамидальной сортировки | Итеративный алгоритм поразрядной LSD-сортировки |


Читайте также:
  1. XXI Международный фестиваль «ЧЕТЫРЕ ЭЛЕМЕНТА» 22 – 24 марта 2016 года на сцене Московского Театра Луны
  2. Алгоритм анализа иллюстрации
  3. Алгоритм вставки элемента в 2-3 - дерево
  4. Алгоритм захисту БД MS Access
  5. Алгоритм катетеризации мочевого пузыря.
  6. Алгоритм пирамидальной сортировки

AVL_Insert(t, k, data, h, inserted)

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

2 k –ключ нового элемента

3 data – данные нового элемента

3 iserted – возвращаемый признак вставки

4 h – возвращаемый признак увеличения высоты

5 h ← FALSE

6 if1 k = key[ t ]

7 then1 inserted ← FALSE

8 return t

9 if2 t=nil

10 then2 tCreate_Node (k, data)

11 bal[ t ] ← 0

12 h ← TRUE

13 inserted ← TRUE

14 return t

15 if3 k < key[ t ]

16 then3 left[ t ] ← AVL_Insert (left[ t ], k, data, hh, ins)

17 if4 hh = TRUE

18 then4 выросла левая ветвь

19 if5 bal[ t ] = 1

20 then5 bal[ t ] ← 0

21 else5 if6 bal[ t ] = 0

22 then6 bal[ t ] ← -1

23 h ← TRUE

24 балансировка

25 else6 if7 bal[left[ t ]] = -1

26 then7 tR (t)

27 else7 tLR (t)

28 else3 right[t] ← AVL_Insert (right[ t ], k, data, hh, ins)

29 if8 hh = TRUE

30 then8 выросла правая ветвь

31 if9 bal[ t ] = -1

32 then9 bal[ t ] ← 0

33 else9 if10 bal[ t ] = 0

34 then10 bal[ t ] ← 1

35 h ← TRUE

36 балансировка

37 else10 if11 bal[right[ t ]] = 1

38 then11 t ← L (t)

39 else11 tRL (t)

40 inserted ← ins

41 return t

R (t)

1 x← left[ t ]

2 left[ t ] ← right[x]

3 right[x] ←t

4 bal[x] ← bal[ t ] ← 0

5 return x

 

LR (t)

1 x ← left[ t ]

2 y ← right[x]

3 right[x] ← left[y]

4 left[y] ← x

5 left[ t ] ← right[y]

6 right[y] ← t

7 if bal[y] =-1

8 then bal[ t ] ← 1

9 else bal[ t ] ← 0

10 if bal[y] = 1

11 then bal[x] ← -1

12 else bal[x] ← 0

13 bal[y] ← 0

14 return y

 

Рекурсивный алгоритм вставки элемента в RB – дерево

RB_Insert(root, k, data)

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

2 k –ключ нового элемента

3 data – данные нового элемента

3 rootRB_Insert1 (root, k, data, 0, ins)

4 color [ root ] ← BLACK

5 return ins

 

RB_Insert1(t, k, data, s, inserted)

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

2 k –ключ нового элемента

3 data – данные нового элемента

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

5 iserted – возвращаемый признак вставки

6 if k = key[ t ]

7 then inserted ← FALSE

8 return t

9 if t = nil

10 then tCreate_RB_Node (k, data)

11 color[ t ] ← RED

12 inserted ← TRUE

13 return t

14 if color[left[ t ]] = RED and color[right[ t ]] = RED

15 then color[ t ] ← RED

16 color[left[ t ]] ← color[right[ t ]] ← BLACK

17 if k < key[ t ]

18 then left[ t ] ← RB_Insert1 (left[ t ], k, data,0, ins)

19 if color[ t ] = RED and color[left[ t ]] = RED and s = 1

20 then tR (t)

21 if color [left[ t ]] = RED and color [left[left[ t ]]] = RED

22 then tR (t)

23 color[ t ] ← BLACK

24 color[right[ t ]] ← RED

25 else right[ t ] ← RB_Insert1 (right[ t ], k, data,1, ins)

26 if color[ t ] = RED and color[right[ t ]] = RED and s = 0

27 then tL (t)

28 if color[right[ t ]] = RED and color[right[right[ t ]]] = RED

29 then tL (t)

30 color[ t ] ← BLACK

31 color[left[ t ]] ← RED

32 inserted ← ins

33 return t

Итеративный алгоритм вставки элемента в RB – дерево

It_RB_Insert(root, k, data)

1 root- корень дерева

2 k –ключ нового элемента

3 data – данные нового элемента

4 if root = tnil tnil – фиктивный узел RB-дерева

5 then rootCreate_RB_Node (k,data)

6 color[ root ] ← BLACK

7 return TRUE

8 t ← root

9 while t ≠ tnil

Do

11 pred ← t

12 if k = key[t]

13 then return FALSE

14 if k < key[t]

15 then t ← left[t]

16 else t ← right[t]

17 if k < key[pred]

18 then t ← left[pred] ← Create_RB_Node (k, data)

19 else t ← right[pred] ← Create_RB_Node (k, data)

20 color[t] ← RED

21 while t ≠ root and color[p[t]] = RED

22 do if p[t] = left[p[p[t]]]

23 then y ← right[p[p[t]]]

24 if color[y]=RED случай 1

25 then color[p[t]] ← color[y] ← BLACK

26 color[p[p[t]]] ← RED

27 t ← p[p[t]]

28 else if t = right[p[t]] случай 2

29 then t ← p[t]

30 It_L (root, t)

31 color[p[t]] ← BLACK случай 3

32 color[p[p[t]]] ← RED

33 It_R (root, p[p[t]])

34 else симметричный текст (строки 23 – 33)с заменой left на right

35 конец цикла

36 color[ root ] ← BLACK

37 return TRUE

It_L (root, t)

1 x ← right[ t ]

2 right[ t ] ← left[x]

3 if left[x] ≠ tnil tnil – фиктивный узел RB-дерева

4 then p[left[x]] ← t

5 p[x] ← p[ t ]

6 if p[ t ] = tnil

7 then root ← x

8 else if t = left[p[ t ]]

9 then left[p[ t ]] ← x

10 else right[p[ t ]] ← x

11 left[x] ← t

12 p[ t ] ← x

 

Итеративный алгоритм удаления элемента из RB – дерева

It_RB_Delete (root, k)

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

2 k –ключ удаляемого элемента

3 t ← root

4 while k ≠ key[t] and t ≠ tnil tnil – фиктивный узел RB-дерева

5 do if k < key[t]

6 then t ← left[t]

7 else t ← right[t]

8 if t = tnil

9 then return FALSE

10 if left[t]= tnil or right[t] = tnil

11 then x ← t x- удаляемый узел

12 else x ← BST_Successor(root, t)

13 if left[x] ≠ tnil

14 then y ← left[x] y-сын удаляемого узла, возможно tnil

15 else y ← right[x]

16 p[y] ← p[x]

17 if p[x]= tnil x - корень

18 then root ← y

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

20 then left[p[x]] ← y

21 else right[p[x]] ← y

22 if x ≠ t x -замещающий узел

23 then key[t] ← key[x]

24 data[t] ← data[x]

25 if color[x]=BLACK

26 then RB_Fixup (root, y)

27 Delete_Node (x)

28 return TRUE

RB_Fixup(root, y)

1 root - корень дерева

2 y - узел с двойной чернотой

3 while yroot and color[ y ] = BLACK

4 do if y = left[p[ y ]]

5 then w ← right[p[ y ]]

6 if color[w] = RED случай 1

7 then color[w] ← BLACK

8 color[p[ y ]] ← RED

9 It_L (root, p[ y ])

10 w ← right[p[ y ]]

11 if color[left[w]] =BLACK and color[right[w]]=BLACK случай 2

12 then color[w] ← RED

13 y ← p[ y ]

14 else if color[left[w]] = RED случай 3

15 then color[left[w]] ← BLACK

16 color[w] ← RED

17 It_R (root, w)

18 w ← right[p[ y ]]

19 случай 4

20 color[w] ← color[p[ y ]]

21 color[p[ y ]] ← BLACK

22 color[right[w]] ← BLACK

23 It_L (root, p[ y ])

24 yroot для прекращения цикла

Else

26 симметричный фрагмент для y = right[p[ y ]]с заменой left на right

27 конец цикла

28 color[ y ] ← BLACK если y – красный узел или y -корень


Дата добавления: 2015-11-04; просмотров: 81 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Алгоритм удаления из BST-дерева на основе объединения поддеревьев| Алгоритм вставки элемента в 2-3 - дерево

mybiblioteka.su - 2015-2024 год. (0.026 сек.)