Добавил:
надеюсь это добро кому-то поможет Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лаба 2 самобалансирующие деревья 3 сем.docx
Скачиваний:
2
Добавлен:
09.07.2025
Размер:
400.01 Кб
Скачать

Красно-черное дерево (rb Tree)

Красно-чёрное дерево — самобалансирующееся двоичное дерево поиска с дополнительной окраской узлов в красный или черный цвет. При построении соблюдаются следующие правила:

Каждый узел может быть либо красным, либо чёрным.

Корень — чёрный.

Все листья, не содержащие данные — чёрные. 

Оба потомка каждого красного узла — чёрные. 

Любой простой путь от узла-предка до листового узла-потомка содержит одинаковое число чёрных узлов. 

Основные операции с rb Tree

  1. Вставка:

Новый узел вставляется в дерево по примеру вставки для бинарного, описанного во вставке элемента для AVL.

После вставки необходимо проверить, не является ли родитель вставленного узла красным. При этой ситуации рассматриваются несколько случаев:

Случай 1: Дядя красный (родитель и дядя красные):

Поменять цвет родителя и дяди на черный.

Поменять цвет дедушки на красный.

Повторить проверку для нового узла.

Случай 2: Дядя черный (родитель красный, дядя черный):

Подслучай: Новый узел N — левый ребенок родителя (Левый случай)

Выполнить правый поворот на дедушке:

При этом узел родитель станет новым родителем для поддерева, а дедушка становится правым ребенком родителя.

Далее меняем цвета: цвет родителя на черный, цвет дедушки на красный

Подслучай: Новый узел N — правый ребенок родителя  (Правый случай)

Выполнить левый поворот на родителе P (приводит к тому, что N становится новым родителем для поддерева):

 N становится родителем, а родитель становится левым ребенком N.

Новый узел N как родитель, левый случай:

Выполнить правый поворот на дедушке, как в случае 2.1.

Поменять цвета: цвет N поменять на черный, цвет дедушки красный.

После выполнения операций необходимо проверить не стал ли корень дерева красным. В этом случае перекрашиваем его в черный цвет. При этом ничего не изменится, так как любой простой путь будет содержать на один черный узел больше, чем раньше.

Удаление:

Поиск удаляемого элемента происходит так же как и в бинарном дереве (см поиск удаляемого элемента для AVL).

Затем происходит удаление узла по алгоритму:

Если узел не имеет детей: удалить узел.

Если узел имеет одного ребенка: заменить узел на ребенка.

Если узел имеет двух детей:

Найти наименьший узел в правом поддереве или наибольший узел в левом поддереве. Скопировать найденное значение в узел для удаления. Удалить наибольший/наименьший узел.

После удаления необходимо проследить за выполнениями условий красно-черного дерева. Если узел был красным, то никаких дополнительных действий не требуется. Если удаляемый или заменяющий его узел были черными, выполнить следующие действия:

Случай 1: Брат красный:

Повернуть дерево так, чтобы брат стал родителем, путем вращения вокруг родителя удаленного узла.

Нового родителя перекрасить в черный, брата в черный.

Случай 2: Брат черный:

Проверить его детей:

Подслучай: У брата есть хотя бы один красный ребенок:

Повернуть дерево так, чтобы один из красных детей стал новым родителем. Нового родителя перекрасить в черный, брат и его красный ребенок черные.

Подслучай: У брата нет красных детей (оба ребенка черные):

Перекрасить брата в красный. Если родитель удаленного узла был черным, свойства опять могут быть нарушены, поэтому необходимо переместиться к родителю и повторить процесс до корня или до встречи красного узла.

После выполнения всех действий проверить является ли корень черным, в противном случае перекрасить.