Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Двоичные деревья поиска и красно-черные деревья....doc
Скачиваний:
1
Добавлен:
05.11.2018
Размер:
235.01 Кб
Скачать

14.2. Вращения

Операции tree-insert и tree-delete выполняются на красно-чёрном) реве за время O(logn), но они изменяют дерево, и результат может не обла RB-свойствами, описанными в разделе 14.1. Чтобы восстановить эти своё надо перекрасить некоторые вершины и изменить структуру дерева.

Мы будем менять структуру с помощью вращений (rotations). Bpa представляет собой локальную операцию (меняется несколько указателей) храняет свойство упорядоченности. На рис. 14.2 показаны два взаимно обрат вращения: левое и правое. Левое вращение возможно в любой вершине х. пра ребёнок которой (назовём его у) не является листом (nil). После вращения y оказывается сверху, х становится левым ребёнком у, а бывший левый ребёнок j-j правым ребёнком х.

Рис. 14.2. Операции вращения на двоичном дереве поиска. Операция right-rotatk пре­образует левое дерево в правое, меняя несколько указателей. Правое дерево можно перевести в левое обратной операцией left-rotate. Вершины х и у могут нахо­диться в любом месте дерева. Буквы а, (3 и у обозначают поддеревья, В обоих деревьях выполнено одно и то же свойство упорядоченности: ключи из а предшествуют fcry[x], который предшествует ключам из {3, которые предшествуют key[y], который предшествует ключам из у.

В процедуре left-rotate предполагается, что right[x]<>nil.

left-rotate (T, x)

  1. у <— right[x] > Находим у.

  2. right[x] <— left[y] > Левое поддерево у становится

правым поддеревом х.

3 if left[y] <>NIL

4 then p[left[y}]<— x

  1. p[y] <- p[x] > Делаем родителя x родителем у.

  2. if p[x) = nil

  1. then root[T] «- у

  2. else if x = left\p[x]]

9 then /e/it[p[a:]] •<— у

10 else n<7/&£[p[:r]] •<— у

  1. left[y]<— ,т о Делаем х левым ребёнком у.

  2. p[x] <-y

6