Скачать презентацию 3. 35. Нарушение свойств дерева при вставке 1. Скачать презентацию 3. 35. Нарушение свойств дерева при вставке 1.

3 Деревья (продолжение).ppt

  • Количество слайдов: 66

3. 35. Нарушение свойств дерева при вставке 1. Каждый узел является красным или черным 3. 35. Нарушение свойств дерева при вставке 1. Каждый узел является красным или черным не нарушается 2. Корень дерева является черным может быть нарушено 3. Каждый лист дерева является черным не нарушается 1

3. 35. Нарушение свойств дерева при вставке 4. Если узел – красный, то оба 3. 35. Нарушение свойств дерева при вставке 4. Если узел – красный, то оба его дочерних узла – черные может быть нарушено 5. Для каждого узла все пути от него до листьев, являющихся потомками данного узла, содержат одно и то же количество черных узлов не нарушается 2

3. 36. Примеры вставки 2 41 2 1 30 47 28 25 38 35 3. 36. Примеры вставки 2 41 2 1 30 47 28 25 38 35 1 1 1 39 1 Новый элемент 25 40 Новый элемент 40 3

3. 37. Восстановление свойств дерева A pp B p 1 C x D p 3. 37. Восстановление свойств дерева A pp B p 1 C x D p 2 Новый узел – x p 1 = x->parent узел p 1 – красный pp = p 1 ->parent – черный p 2 = pp->right (или p 2 = pp->left) 4

3. 38. Случай 1 Узел p 2 – красный Узел pp – черный Узлы 3. 38. Случай 1 Узел p 2 – красный Узел pp – черный Узлы , , – черные Коррекция: перекрасить узлы p 1 и p 2 в черный цвет, pp – в красный Переустановить узел x Продолжить коррекцию дерева 5

3. 38. Случай 1 A pp B p 1 C x D p 2 3. 38. Случай 1 A pp B p 1 C x D p 2 6

3. 38. Случай 1 A B p 1 C x D x pp p 3. 38. Случай 1 A B p 1 C x D x pp p 2 A pp B p 1 C p 2 D 7

3. 38. Случай 1 A B p 1 x D x pp C p 3. 38. Случай 1 A B p 1 x D x pp C p 2 A pp B p 1 D C p 2 8

3. 39. Вставка узла 40 2 41 2 1 25 30 47 28 38 3. 39. Вставка узла 40 2 41 2 1 25 30 47 28 38 35 1 1 1 39 1 Новый элемент 40 9

3. 39. Вставка узла 40 2 41 2 1 25 30 47 2 Нарушение 3. 39. Вставка узла 40 2 41 2 1 25 30 47 2 Нарушение свойства дерева 1 38 28 35 1 39 1 Новый элемент 40 10

3. 40. Случай 2 Узел p 2 – черный Узел x – в правом 3. 40. Случай 2 Узел p 2 – черный Узел x – в правом поддереве узла p 1 Узел pp – черный Узлы , , – черные Коррекция: шаг 1 – левый поворот вокруг узла p 1 Переходим к случаю 3 11

3. 40. Случай 2 A pp B p 1 C x D A p 3. 40. Случай 2 A pp B p 1 C x D A p 2 pp D p 1 x B C p 2 12

3. 41. Вставка узла 40 (продолжение) 2 41 2 1 25 30 Левый поворот 3. 41. Вставка узла 40 (продолжение) 2 41 2 1 25 30 Левый поворот 28 38 35 1 47 1 1 39 1 40 13

3. 41. Вставка узла 40 (продолжение) 2 Нарушение свойства дерева 38 30 1 28 3. 41. Вставка узла 40 (продолжение) 2 Нарушение свойства дерева 38 30 1 28 41 2 1 47 39 35 1 1 1 40 25 14

3. 42. Случай 3 Узел p 2 – черный Узел x – в левом 3. 42. Случай 3 Узел p 2 – черный Узел x – в левом поддереве узла p 1 Узел pp – черный Узлы , , – черные Коррекция: шаг 1 – перекрасить узел p 1 в черный цвет, узел pp – в красный цвет шаг 2 – правый поворот вокруг узла pp 15

3. 42. Случай 3 pp а) перекраска A D p 1 x B C 3. 42. Случай 3 pp а) перекраска A D p 1 x B C p 2 A pp D p 1 x B C p 2 16

3. 43. Случай 3 б) правый поворот A pp D p 1 x B 3. 43. Случай 3 б) правый поворот A pp D p 1 x B C p 2 B A pp C p 2 17

3. 44. Вставка узла 40 (продолжение) 2 3 ? ? ? Перекрашивание 41 38 3. 44. Вставка узла 40 (продолжение) 2 3 ? ? ? Перекрашивание 41 38 30 1 28 1 2 1 47 39 35 1 1 1 40 25 18

3. 44. Вставка узла 40 (продолжение) 2 3 ? ? ? Правый поворот 38 3. 44. Вставка узла 40 (продолжение) 2 3 ? ? ? Правый поворот 38 30 1 28 41 2 1 47 39 35 1 1 1 40 25 19

3. 44. Вставка узла 40 (продолжение) 38 30 1 28 2 2 1 41 3. 44. Вставка узла 40 (продолжение) 38 30 1 28 2 2 1 41 35 1 39 1 47 1 25 40 20

3. 45. Алгоритм RB_Insert_Fixup(x) x – вставленный узел while родительский узел для x – 3. 45. Алгоритм RB_Insert_Fixup(x) x – вставленный узел while родительский узел для x – красный (x->parent = RED) { p 1 = x->parent – родительский узел x pp = p 1 ->parent – родительский узел p 1 if p 1 = pp->left { #1 – начало Узел вставляется в левое поддерево p 2 = pp->right 21

3. 45. Алгоритм RB_Insert_Fixup(x) if p 2 ->color = RED { случай 1: перекрасить 3. 45. Алгоритм RB_Insert_Fixup(x) if p 2 ->color = RED { случай 1: перекрасить вершины: p 1 ->color = BLACK p 2 ->color = BLACK pp->color = RED x = pp } 22

3. 45. Алгоритм RB_Insert_Fixup(x) else if x в правом поддереве p 1 (x = 3. 45. Алгоритм RB_Insert_Fixup(x) else if x в правом поддереве p 1 (x = p 1 ->right) { случай 2: x = p 1 левый поворот: left_rotate(x) p 1 = x->parent } 23

3. 45. Алгоритм RB_Insert_Fixup(x) Случай 3: перекрасить вершины: p 1 ->color = BLACK pp->color 3. 45. Алгоритм RB_Insert_Fixup(x) Случай 3: перекрасить вершины: p 1 ->color = BLACK pp->color = RED правый поворот: Right_rotate(pp) } #1 – конец 24

3. 45. Алгоритм RB_Insert_Fixup(x) else { узел вставляется в правое поддерево: повторить коды от 3. 45. Алгоритм RB_Insert_Fixup(x) else { узел вставляется в правое поддерево: повторить коды от #1 – начало до #1 – конец, заменив в них left на right, и наоборот } } – конец цикла root->color = BLACK 25

3. 46. Анализ эффективности Вставка в красно-черное дерево = • вставка в двоичное дерево 3. 46. Анализ эффективности Вставка в красно-черное дерево = • вставка в двоичное дерево – О(h) • Коррекция красно-черного дерева Коррекция: итерации – для случая 1 – O(h) для случаев 2 и 3 – максимум два поворота h 2 lg(n + 1), вставка – O(lg(n)) 26

3. 47. Удаление • Удалить узел как в бинарном дереве поиска; учесть представление листьев 3. 47. Удаление • Удалить узел как в бинарном дереве поиска; учесть представление листьев • Восстановить красно-черные свойства дерева x – удаляемый узел дерева 27

3. 48. Алгоритм RB_Delete(x) if x->left = Elist или x->right = Elist y=x else 3. 48. Алгоритм RB_Delete(x) if x->left = Elist или x->right = Elist y=x else y = successor(x) if y->left ≠ Elist p = y->left else p = y->right 28

3. 48. Алгоритм RB_Delete(x) p->parent = y->parent --- отличается! if y->parent = EList root 3. 48. Алгоритм RB_Delete(x) p->parent = y->parent --- отличается! if y->parent = EList root = p else if y->parent->left = y y->parent->left = p else y->parent->right = p 29

3. 48. Алгоритм RB_Delete(x) if y ≠ x { x->key = y->key копирование сопутствующих 3. 48. Алгоритм RB_Delete(x) if y ≠ x { x->key = y->key копирование сопутствующих данных } if y->color = BLACK RB_Delete_Fixup(p) Успех 30

3. 49. Нарушение свойств дерева при удалении Если удаляется красный узел: • никакая черная 3. 49. Нарушение свойств дерева при удалении Если удаляется красный узел: • никакая черная высота в дереве не изменяется • никакие красные узлы не становятся соседними • корень остается черным 31

3. 49. Нарушение свойств дерева при удалении Если удаляется черный узел: 1. Каждый узел 3. 49. Нарушение свойств дерева при удалении Если удаляется черный узел: 1. Каждый узел является красным или черным не нарушается 2. Корень дерева является черным может быть нарушено 3. Каждый лист дерева является черным не нарушается 32

3. 49. Нарушение свойств дерева при удалении 4. Если узел – красный, то оба 3. 49. Нарушение свойств дерева при удалении 4. Если узел – красный, то оба его дочерних узла – черные может быть нарушено 5. Для каждого узла все пути от него до листьев, являющихся потомками данного узла, содержат одно и то же количество черных узлов нарушается!!! 33

3. 50. Примеры удаления 2 2 30 1 41 1 1 28 47 1 3. 50. Примеры удаления 2 2 30 1 41 1 1 28 47 1 35 + черный 1 1 49 1 + черный 38 39 39 1 Удаляемый элемент 34

3. 50. Примеры удаления удаляемый узел + черный bh = 1 EList 35 3. 50. Примеры удаления удаляемый узел + черный bh = 1 EList 35

3. 50. Примеры удаления удаляемый узел + черный bh = 1 EList 36 3. 50. Примеры удаления удаляемый узел + черный bh = 1 EList 36

3. 51. Восстановление черной высоты вершины У потомка – дополнительная чернота: – «дважды черный» 3. 51. Восстановление черной высоты вершины У потомка – дополнительная чернота: – «дважды черный» (атрибут color узла имеет значение BLACK) – «красно-черный» (атрибут color узла имеет значение RED): • восстанавливается свойство 5 • нарушается свойство 1 – значение атрибута color узла не соответствует цвету узла 37

3. 52. Восстановление цвета узла Переместить дополнительную черноту вверх по дереву: 1. Узел является 3. 52. Восстановление цвета узла Переместить дополнительную черноту вверх по дереву: 1. Узел является красно-черным – сделать данный узел «единожды черным» 2. Узел является корнем дерева – убрать излишнюю черноту 3. Выполнить повороты и перекраску, устраняющие двойную черноту 38

3. 52. Восстановление цвета узла Обозначения: x – анализируемый узел дерева p = x->parent 3. 52. Восстановление цвета узла Обозначения: x – анализируемый узел дерева p = x->parent – родительский узел Пусть x = p->left w = p->right – второй потомок узла p x x – дважды черный узел w ≠ EList p w 39

3. 52. Восстановление цвета узла начало Продолжать итерации нет w – красный нет да 3. 52. Восстановление цвета узла начало Продолжать итерации нет w – красный нет да да правый потомок w – черный да нет x – в левом поддереве конец Случай 1 нет у w оба потомка черные да да Случай 3 Случай 2 Случай 4 40

3. 53. Случай 1 Узел w – красный Потомки w – черные x Узел 3. 53. Случай 1 Узел w – красный Потомки w – черные x Узел p – черный 1. Обменять цвета w и p 2. Выполнить левый поворот вокруг узла p Получим случаи 2, 3 или 4 p w 41

3. 53. Случай 1 Удаляемый элемент 180 Шаг 1 ? p 150 2 130 3. 53. Случай 1 Удаляемый элемент 180 Шаг 1 ? p 150 2 130 1 x EList 0+1 . . . w 161 2 154 1 173 1 42

3. 53. Случай 1 Шаг 2 180 p 150 ? . . . w 3. 53. Случай 1 Шаг 2 180 p 150 ? . . . w 161 2 x EList 0+1 154 1 173 1 43

3. 53. Случай 1 2 180 161 . . . p 150 2 x 3. 53. Случай 1 2 180 161 . . . p 150 2 x EList 0+1 w 154 1 173 1 44

3. 54. Случай 2 + черный p Узел w черный оба его потомка – 3. 54. Случай 2 + черный p Узел w черный оба его потомка – черные x w Шаг 1 – забрать черную окраску у x (станет единожды черным) и w (станет красным) Шаг 2 – добавить дополнительный черный цвет узлу p Шаг 3 – переустановить узел x, продолжить коррекцию дерева 45

3. 54. Случай 2 2 89 61 . . . p 45 2 x 3. 54. Случай 2 2 89 61 . . . p 45 2 x EList 0+1 w 54 1 73 1 46

3. 54. Случай 2 Шаг 2 2 89 61 Шаг 1 . . . 3. 54. Случай 2 Шаг 2 2 89 61 Шаг 1 . . . 2 p 45 1 + черный Шаг 3 x EList 0 0+1 w 54 1 73 1 47

3. 54. Случай 2 2 89 61 . . . 45 1 EList 0 3. 54. Случай 2 2 89 61 . . . 45 1 EList 0 54 1 73 1 48

3. 54. Случай 2 89 Удаляемый элемент 45 3 . . . p 37 3. 54. Случай 2 89 Удаляемый элемент 45 3 . . . p 37 2 + черный 1 24 1 x EList 0 0+1 61 54 2 w 42 1 50 1 2 73 1 57 1 49

3. 55. Случай 3 p Узел w – черный, его левый дочерний x w 3. 55. Случай 3 p Узел w – черный, его левый дочерний x w узел – красный, правый – черный Шаг 1 – обменять цвета w и w->left Шаг 2 – выполнить правый поворот вокруг w Получим случай 4 50

3. 55. Случай 3 89 p 45 3 x 37 1 + черный . 3. 55. Случай 3 89 p 45 3 x 37 1 + черный . . . w 61 54 2 42 1 50 1 2 73 1 57 1 51

3. 55. Случай 3 89 p 45 3 x 37 1 + черный . 3. 55. Случай 3 89 p 45 3 x 37 1 + черный . . . w 61 54 2 42 1 50 1 2 шаг 1 73 1 57 1 52

3. 55. Случай 3 89 p 45 3 x 37 1 + черный . 3. 55. Случай 3 89 p 45 3 x 37 1 + черный . . . w 61 54 2 42 1 50 1 ? шаг 2 73 1 57 1 53

3. 55. Случай 3 89 p 45 3 . . . 54 2 x 3. 55. Случай 3 89 p 45 3 . . . 54 2 x 37 1 + черный 42 1 50 1 w 61 2 57 1 73 1 54

3. 56. Случай 4 Узел w – черный, его правый дочерний узел – красный 3. 56. Случай 4 Узел w – черный, его правый дочерний узел – красный p x w Шаг 1 – обменять цвета у узлов w, p и правого дочернего узла w Шаг 2 – левый поворот вокруг узла p Шаг 3 – отнять черный цвет у узла x 55

3. 56. Случай 4 89 p 45 3 x 37 1 + черный 42 3. 56. Случай 4 89 p 45 3 x 37 1 + черный 42 1 . . . w 54 2 50 1 61 2 57 1 73 1 56

3. 56. Случай 4 89 p 45 3 x 37 1 + черный 42 3. 56. Случай 4 89 p 45 3 x 37 1 + черный 42 1 . . . Шаг 1 w 54 2 50 1 61 2 57 1 73 1 57

3. 56. Случай 4 Шаг 2 89 p 45 ? x 37 1 + 3. 56. Случай 4 Шаг 2 89 p 45 ? x 37 1 + черный 42 1 . . . w 54 ? 50 1 61 2 57 1 73 1 58

3. 56. Случай 4 89 2 ? . . . w 54 Шаг 3 3. 56. Случай 4 89 2 ? . . . w 54 Шаг 3 p 45 ? 2 x 37 1 + черный 50 1 61 2 57 1 73 1 42 1 59

3. 57. RB_Delete_Fixup(x) Обозначения: x – анализируемый узел дерева p = x->parent – родительский 3. 57. RB_Delete_Fixup(x) Обозначения: x – анализируемый узел дерева p = x->parent – родительский узел w = p->right (или p->left) – второй потомок узла p x – дважды черный узел 60

3. 57. RB_Delete_Fixup(x) while продолжать итерации: x ≠ root и x->color == BLACK { 3. 57. RB_Delete_Fixup(x) while продолжать итерации: x ≠ root и x->color == BLACK { проверка, в каком поддереве лежит x: p = x->parent if х – в левом поддереве: x == p->left { # 1 – начало w = p->right анализ возможных ситуаций 61

3. 57. RB_Delete_Fixup(x) if w – красый: w->color == RED { – случай 1 3. 57. RB_Delete_Fixup(x) if w – красый: w->color == RED { – случай 1 поменять цвета у w и p: w->color = BLACK p->color = RED выполнить левый поворот вокруг p: Left_Rotate(p) w = p->right } 62

3. 57. RB_Delete_Fixup(x) if у w оба потомка черные: w->left->color == BLACK и w->right-color 3. 57. RB_Delete_Fixup(x) if у w оба потомка черные: w->left->color == BLACK и w->right-color == BLACK { – случай 2 забрать черную окраску у w: w->color = RED переместиться вверх по дереву: x=p } 63

3. 57. RB_Delete_Fixup(x) else { if правый потомок w черный: w->right->color == BLACK { 3. 57. RB_Delete_Fixup(x) else { if правый потомок w черный: w->right->color == BLACK { – случай 3 поменять цвета у w и w->left: w->color = RED w->left->color = BLACK правый поворот вокруг w: Right_Rotate(w) w = p->right } 64

3. 57. RB_Delete_Fixup(x) – случай 4 поменять цвета: w->color = p->color = BLACK w->right->color 3. 57. RB_Delete_Fixup(x) – случай 4 поменять цвета: w->color = p->color = BLACK w->right->color = BLACK левый поворот вокруг узла p Left_Rotate(p) x = root } } # 1 – конец 65

3. 57. RB_Delete_Fixup(x) else { повторить коды между #1 – начало и #1 – 3. 57. RB_Delete_Fixup(x) else { повторить коды между #1 – начало и #1 – конец, заменив left на right, и наоборот } } x->color = BLACK 66