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

Свойства

  1. Корневое свойство: корневой узел черный
  2. Красное свойство: у красных узлов может быть только ноль или два черных потомка.
  3. Свойство черного: каждый путь в дереве от корня до конечного узла должен содержать одинаковое количество черных узлов.

Дополнительные правила

  • Каждый новый узел красный
  • Нулевые дети считаются черными

Вставка

Временная сложность: O(logN)

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

Какое свойство будет нарушено после вставки?

Корневое свойство: будет нарушено только при вставке в пустое дерево. Мы просто добавляем новый красный узел и перекрашиваем его в черный цвет.

Black Property: Не будет нарушено

Красное свойство: будет нарушено, если мы вставим узел, где его родитель красный.

Случаи нарушения красной собственности и алгоритм ремонта

  • K — узел для вставки
  • Г — дедушка
  • П — родитель
  • С - брат
  • противоположная сторона — если A — левый дочерний элемент, а B — правый дочерний элемент, они находятся на противоположных сторонах.
  • на той же стороне — если A — левый дочерний элемент, а B — также левый дочерний элемент, они находятся на одной стороне

Случай 0: родной брат родителя К. черный и находится на противоположной стороне

Ремонт:

  • Поверните родителя и дедушку и бабушку и поменяйте местами их цвета

Случай 1: родной брат родителя К. темнокожий и находится с той же стороны

Ремонт:

  • Вращайте красные узлы, чтобы получить кейс 1 и отремонтировать кейс 1.

Случай 2: родной брат родителя К. красный

Ремонт:

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

Удаление

Временная сложность: O(logN)

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

Какие свойства могут быть нарушены после удаления?

Корневое свойство: будет нарушено, если корневой узел будет заменен красным узлом.

Красное свойство: будет нарушено, если родитель узла, который нужно удалить, и его замена оба красного цвета.

Свойство Black: будет нарушено, если мы удалим черный узел, который не является корневым узлом.

Алгоритм восстановления зависит от того, сколько дочерних элементов имеет удаляемый узел

  • K — на этот раз K — это узел, который мы хотим удалить.
  • DB — двойной черный узел
  • R, L, R — произвольные буквы узла для отслеживания его нового положения после операции восстановления.

Случай 0: у K нет дочерних элементов

  • Установите для родительской ссылки K значение null
  • Если K красный: Нет нарушений
  • Если K черный: замените K двойным черным нулевым узлом.

Случай 1: у К. есть один ребенок

  • Установите ссылку родителя дочернего элемента K на его дедушку и бабушку и перекрасьте дочерний элемент в черный цвет.

Примечание.

  • K должен быть черным узлом, так как он имеет только одного потомка. (Красная собственность)
  • Дочерний элемент должен быть красным узлом, так как это единственный дочерний элемент в этом поддереве (черное свойство)

Случай 2: у К. двое детей

  • Здесь мы выполняем удаление BST, заменяя значение K значением узла-предшественника или преемника и удаляя этот узел. Мы не меняем цвет только что замененного K.

Алгоритм восстановления двойного черного узла

Случай 0: корень дважды черный

Ремонт:

  • Мы можем просто удалить один черный из корня

Случай 1: одноуровневый элемент двойного черного является черным по крайней мере с одним красным дочерним элементом (также случай, когда есть только один красный дочерний элемент, и он находится на противоположной стороне двойного черного узла) (двойной -черный левый ребенок)

Ремонт:

  • Поворот и замена цвета родителя и брата
  • Изменить двойной черный на черный
  • Сменить красный на черный

Случай 1.5: если есть только один красный дочерний элемент, и он находится на той же стороне, что и двойной черный узел.

Ремонт:

  • Поверните дочерний элемент и его родителя, чтобы получить случай 1, и выполните ремонт случая 1.

Случай 2 (Зеркало случая 1): одноуровневый элемент двойного черного является черным по крайней мере с одним красным дочерним элементом (также случай, когда есть только один красный дочерний элемент, и он находится на противоположной стороне двойной черный узел) (двойной черный - правый дочерний элемент)

Ремонт:

  • Поворот и замена цвета родителя и брата
  • Изменить двойной черный на черный
  • Сменить красный на черный

Случай 2.5 (Зеркало случая 1.5): если есть только один красный дочерний элемент, и он находится на той же стороне, что и двойной черный узел.

Ремонт:

  • Поверните дочерний элемент и его родителя, чтобы получить случай 2, и выполните ремонт случая 2.

Случай 3: одноуровневый узел двойного черного узла является черным и имеет только черные дочерние элементы.

Ремонт:

  • Удалите двойное черное из A и замените родственного на красный.
  • Учет удаления путем добавления черного цвета в его корень. Если корень красный, измените его на черный. Если он был черным, измените его на двойной черный (подталкивая нарушение вверх по дереву)

Случай 4: один из элементов двойного черного является красным

Ремонт :

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

Заключение

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

Соус

Все права на контент принадлежат моим замечательным профессорам CS400 в UW-Madison, Флориану Хеймерлу и Гэри Далу :D