- •Теоретическая часть
- •Основные операции с авл-деревом
- •Вставка:
- •Удаление
- •Балансировка после вставки/удаления:
- •Верхняя оценка высоты авл-дерева
- •Красно-черное дерево (rb Tree)
- •Основные операции с красно-черным деревом
- •Балансировка дерева после вставки:
- •Балансировка дерева после удаления:
- •Верхняя оценка высоты красно-черного дерева
- •Практическая часть Асимптотика Бинарное дерево поиска (bst)
- •Лучший случай:
- •Средний случай:
- •Худший случай:
- •Зависимость высоты дерева от количества ключей Бинарное дерево поиска
- •Красно-черное дерево
- •Обходы дерева
- •Обход дерева в ширину
- •Обход дерева в глубину Прямой обход или preorder
- •Симметричый (центрированный) обход или inorder
- •Обратный обход или postorder
- •Код программы Графики для Бинарного дерева поиска:
- •Бинарное дерево поиска:
- •Графики для авл-дерева
- •Графики для кч-дерева
- •Обход деревьев
Балансировка дерева после вставки:
Рассмотрим ситуации для узла k (нового узла), его родителя P, и деда G (родителя P):
Случай 1: Родитель красный, дядя красный
перекрашиваем P и дядю в черный
перекрашиваем G в красный
перемещаем текущий узел k на уровень выше (на место G) и повторяем проверку.
Случай 2: Родитель красный, дядя черный
Тут возможны два подслучае, если родитель P красный, а дядя черный или отсутствует.
Подслучай 2.1: Левый-левый (LL)
K - левый потомок P, а P - левый потомок G.
Выполянем правое вращение вокруг G.
Перекрашиваем P в черный, G в красный
Подслучай 2.2: Левый-правый (LR)
K - правый потомок P, а P - левый потомок G.
Выполняем левое вращение вокруг P.
После вращения узел k станет левым потомком G, и ситуация сведется к случаю LL
Подслучай 2.3: Правый-правый (RR)
K - правый потомок P, а P - правый потомок G.
Выполняем левое вращение вокруг G.
Перекрашиваем P в черный, G в красный
Подслучай 2.4: Правый-левый (RL)
K - левый потомок P, а P - правый потомок G.
Выполняем правое вращение вокруг P.
После вращения узел k станет правым потомком G, и ситуация сведется к случаю RR.
Проверка корня: После всех преобразований корень всегда должен быть черным. Если в процессе балансировки он стал красным, перекрашиваем его в черный.
Удаление
Удаление узла из КЧ-дерева выполняется по стандартным правилам для двоичного дерева поиска:
Удаляемый узел — лист (не имеет потомков): просто удаляем узел.
Удаляемый узел имеет одного потомка: заменяем удаляемый узел его единственным потомком.
Удаляемый узел имеет двух потомков:
Находим наименьший узел в правом поддереве (преемник) или наибольший узел в левом поддереве (предшественник).
Копируем его значение в удаляемый узел.
Рекурсивно удаляем найденный узел (который будет либо листом, либо иметь одного потомка).
Проверка свойств КЧ-дерева:
Если удаляемый узел красный, просто удаляем его. Свойства дерева не нарушаются.
Если удаляемый узел черный: это может нарушить свойства дерева (например, количество черных узлов на пути к листу). Выполняем балансировку.
Балансировка дерева после удаления:
Рассмотрим ситуацию для узла k (сын удаленного узла), его родителя P и брата B:
Случай 1: Родитель P красный, остальные узлы черные:
Перекрашиваем B в красный, а P в черный
Случай 2: Брат B черный, а его правый потомок красный:
Независимо от того, является ли P черным или красным:
Выполняем вращение вокруг B.
Перекрашиваем правый потомок в черный цвет
Меняем цветами P и В
Случай 3: Брат B черный, его правый потомок черный, а левый потомок красный:
Выполняем вращение левого потомка вокруг P так, чтобы поддерево B вытянулось в одну линию
Меняем цветами левого потомка и B.
Случай 4: Брат B красный
Перекрашиваем B в черный и P в красный
Выполняем вращение P вокруг B.
Cлучай 5: Все узлы комбинации (брат B, его потомки, а также родитель P) черные.
Перекрашиваем B в красный цвет.
Если P не является корнем дерева, нужно продолжить наверх процесс восстановления свойств КЧ-дерева, совершая поиск соответсвующего случая, начиная со случая 1.
