Красный черный дерево удаление неизвестного поведения - PullRequest
0 голосов
/ 07 декабря 2018

Я ввел несколько цифр в красное черное дерево.(41; 38; 31; 12; 19; 8) после удаления 8 и 12 (1-й скриншот) он попал в тип второго скриншота.Я не могу понять, почему эти 31 превращаются в красные.Пожалуйста, помогите мне с этим?Не могли бы вы упомянуть случай, связанный с этим.Спасибо!

image

1 Ответ

0 голосов
/ 08 декабря 2018

Если вы посмотрите объяснение алгоритма удаления в Википедии , вы можете отобразить их имена узлов в ваше дерево следующим образом:

M = 0012,черный узел для удаления
C = лист NIL ниже 0012 (NIL всегда считаются черными)

Далее в статье говорится о вашем фактическом случае:

Сложный случай, когда оба M и C являются черными.[...] Мы начинаем с замены M его дочерним элементом C .[...] Мы будем relbel этот ребенок C (в новой позиции) N и его брат (другой ребенок его нового родителя) S [...] мы также будем использовать P для нового родителя N , S L для S левый ребенок и S R для S правый ребенок

Так что теперь мы имеемпосле удаления, но перед перекрашиванием:

enter image description here

P = 0019 (красный)
N = лист NIL, левый потомок 0019
S = 0031, правый потомок 0019

В описании указаны несколько случаев, и рассматриваемый случай представляет собойследующий:

Случай 4: дети S и S черные, а P красные.В этом случае мы просто меняем цвета S и P .

Объясняется причина этого цветового обмена:

Это не влияет на количество черных узлов на путях, проходящих через S , но этодобавляет один к числу черных узлов на путях, проходящих через N , компенсируя удаленный черный узел на этих путях.

Напомним, что в красно-черных деревьях этот инвариант должен поддерживаться ( свойство 5 ):

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

Этот инвариант был бы нарушен, если бы вышеприведенный обмен цвета был опущен.

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