Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лаба по деревьям - 3 сем АИСД.docx
Скачиваний:
11
Добавлен:
08.07.2025
Размер:
1.56 Mб
Скачать
  1. Балансировка дерева после вставки:

Рассмотрим ситуации для узла 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.

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

  1. Удаление

Удаление узла из КЧ-дерева выполняется по стандартным правилам для двоичного дерева поиска:

  1. Удаляемый узел — лист (не имеет потомков): просто удаляем узел.

  2. Удаляемый узел имеет одного потомка: заменяем удаляемый узел его единственным потомком.

  3. Удаляемый узел имеет двух потомков:

    1. Находим наименьший узел в правом поддереве (преемник) или наибольший узел в левом поддереве (предшественник).

    2. Копируем его значение в удаляемый узел.

    3. Рекурсивно удаляем найденный узел (который будет либо листом, либо иметь одного потомка).

Проверка свойств КЧ-дерева:

  1. Если удаляемый узел красный, просто удаляем его. Свойства дерева не нарушаются.

  2. Если удаляемый узел черный: это может нарушить свойства дерева (например, количество черных узлов на пути к листу). Выполняем балансировку.

  1. Балансировка дерева после удаления:

Рассмотрим ситуацию для узла 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.