
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] у |
|