Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

сиаод / 1-34 / 30. Красно – черные деревья. Свойства. Вращение. Высота красно – черного дерева

..pdf
Скачиваний:
74
Добавлен:
11.05.2015
Размер:
239.96 Кб
Скачать

30. Красно – черные деревья. Свойства. Вращение. Высота красно – черного дерева.

Красно-черные деревья представляют собой одну из множества "сбалансированных" схем деревьев поиска, которые гарантируют время выполнения операций над динамическим множеством O(log2n) даже в наихудшем случае.

Красно-черное дерево (red-black tree) - двоичное дерево поиска, вершины которого разделены на красные (red) и черные (black).

Каждая вершина красно-черного дерева имеет поля color (цвет), key (ключ), left (левый ребенок), right (правый ребенок) и p (родитель). Если у вершины отсутствует ребенок или родитель, то соответствующее поле содержит NIL.

Двоичное дерево поиска называется красно-черным, если оно обладает следующими свойствами:

1 каждая вершина - либо черная, либо красная ; 2 корень дерева является черным;

3 каждый лист (NIL) - чёрный ;

4 если вершина красная, оба её ребенка чёрные ; 5 все пути, идущие вниз от корня к листьям, содержат одинаковое количество чёрных вершин.

Повороты

Операции удаления и включения над деревом поиска , будучи применены к красно-черному дереву с n ключами, выполняются за время O(log2n). Поскольку они изменяют дерево, в результате их работы могут нарушаться красно-черные свойства. Для восстановления этих свойств мы должны изменить цвета некоторых узлов дерева, а также структуру его указателей.

Изменения в структуре указателей будут выполняться при помощи поворотов (rotations), которые представляют собой локальные операции в дереве поиска, сохраняющие свойство бинарного дерева поиска.

В псевдокоде процедуры LEFT_ROTATE предполагается, что right [х] nil [Т], а родитель корневого узла - nil [T].

Left_Rotate(T, х)(Right_Rotate(T, х) симметрична)

у right[x] Устанавливаем у.

1 right[x] left[y] Левое поддерево у становится правым поддеревом х

3if left[y] nil[T]

4then p[left[y]] х

5р[у] р[х] Перенос родителя х в у

6if p[x] = nil[T]

7then root[T] у

8else if x = left[p[х]]

9then left [p[x]] у

10else right[p[x]] у

11 left[y] x

x — левый дочерний у

12 p[x] у