Красно-черное дерево (rb Tree)
Красно-чёрное дерево — самобалансирующееся двоичное дерево поиска с дополнительной окраской узлов в красный или черный цвет. При построении соблюдаются следующие правила:
Каждый узел может быть либо красным, либо чёрным.
Корень — чёрный.
Все листья, не содержащие данные — чёрные.
Оба потомка каждого красного узла — чёрные.
Любой простой путь от узла-предка до листового узла-потомка содержит одинаковое число чёрных узлов.
Основные операции с rb Tree
Вставка:
Новый узел вставляется в дерево по примеру вставки для бинарного, описанного во вставке элемента для AVL.
После вставки необходимо проверить, не является ли родитель вставленного узла красным. При этой ситуации рассматриваются несколько случаев:
Случай 1: Дядя красный (родитель и дядя красные):
Поменять цвет родителя и дяди на черный.
Поменять цвет дедушки на красный.
Повторить проверку для нового узла.
Случай 2: Дядя черный (родитель красный, дядя черный):
Подслучай: Новый узел N — левый ребенок родителя (Левый случай)
Выполнить правый поворот на дедушке:
При этом узел родитель станет новым родителем для поддерева, а дедушка становится правым ребенком родителя.
Далее меняем цвета: цвет родителя на черный, цвет дедушки на красный
Подслучай: Новый узел N — правый ребенок родителя (Правый случай)
Выполнить левый поворот на родителе P (приводит к тому, что N становится новым родителем для поддерева):
N становится родителем, а родитель становится левым ребенком N.
Новый узел N как родитель, левый случай:
Выполнить правый поворот на дедушке, как в случае 2.1.
Поменять цвета: цвет N поменять на черный, цвет дедушки красный.
После выполнения операций необходимо проверить не стал ли корень дерева красным. В этом случае перекрашиваем его в черный цвет. При этом ничего не изменится, так как любой простой путь будет содержать на один черный узел больше, чем раньше.
Удаление:
Поиск удаляемого элемента происходит так же как и в бинарном дереве (см поиск удаляемого элемента для AVL).
Затем происходит удаление узла по алгоритму:
Если узел не имеет детей: удалить узел.
Если узел имеет одного ребенка: заменить узел на ребенка.
Если узел имеет двух детей:
Найти наименьший узел в правом поддереве или наибольший узел в левом поддереве. Скопировать найденное значение в узел для удаления. Удалить наибольший/наименьший узел.
После удаления необходимо проследить за выполнениями условий красно-черного дерева. Если узел был красным, то никаких дополнительных действий не требуется. Если удаляемый или заменяющий его узел были черными, выполнить следующие действия:
Случай 1: Брат красный:
Повернуть дерево так, чтобы брат стал родителем, путем вращения вокруг родителя удаленного узла.
Нового родителя перекрасить в черный, брата в черный.
Случай 2: Брат черный:
Проверить его детей:
Подслучай: У брата есть хотя бы один красный ребенок:
Повернуть дерево так, чтобы один из красных детей стал новым родителем. Нового родителя перекрасить в черный, брат и его красный ребенок черные.
Подслучай: У брата нет красных детей (оба ребенка черные):
Перекрасить брата в красный. Если родитель удаленного узла был черным, свойства опять могут быть нарушены, поэтому необходимо переместиться к родителю и повторить процесс до корня или до встречи красного узла.
После выполнения всех действий проверить является ли корень черным, в противном случае перекрасить.
