Может ли кто-нибудь объяснить удаление дерева левого-красно-черного дерева?

Я изучаю Left-Lean-Red-Black tree, от Prof.Robert Sedgewick

http://www.cs.princeton.edu/~rs/talks/LLRB/LLRB.pdf http://www.cs.princeton.edu/~rs/talks/LLRB/RedBlack.pdf

Пока я понял, что insert 2-3 tree и LLRB, я провел полностью как 40 часов в течение 2 недель, и я все еще не могу получить удаление LLRB.

Может ли кто-нибудь действительно объяснить deletion of LLRB мне?

Ответы

Ответ 1

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

  • где там есть дисбаланс/новые узлы в дереве, а
  • сколько дисбаланса существует.

Вот почему все новые узлы красные. Когда узлы (локально) балансируют, они подвергаются цветному перевороту, а покраснение передается родительскому, и теперь родитель может выглядеть несбалансированным относительно своего брата.

В качестве иллюстрации рассмотрим ситуацию, когда вы добавляете узлы от большего к меньшему. Вы начинаете с node Z, который теперь является корневым и является черным. Вы добавляете node Y, который является красным и является левым дочерним элементом Z. Вы добавляете красный X как дочерний элемент Z, но теперь у вас есть два последовательных красных, поэтому вы поворачиваете вправо, перекрашиваете, и у вас есть сбалансированный, все черные (без дисбаланса/ "новые узлы"!) дерево, укорененное в Y [первый рисунок]. Теперь вы добавляете W и V в этом порядке. Сначала они оба красные [второй рисунок], но сразу V/X/W повернуты вправо, а цвет перевернулся, так что только X красный [третий рисунок]. Это важно: красный символ X означает, что левое поддерево Y не сбалансировано двумя узлами, или, другими словами, в левом поддереве есть два новых узла. Таким образом, высота красных ссылок - это количество новых, потенциально несбалансированных узлов: в красном поддереве есть 2 ^ высоты новых узлов.

enter image description here

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

Следующей проблемой для решения является тот факт, что при запуске удаления мы не знаем, будет ли удаляться целевой node красный или нет. Одна из стратегий заключалась бы в том, чтобы выяснить сначала. Однако, согласно моему чтению вашей первой справки, выбранная стратегия должна гарантировать, что удаленный node можно сделать красным, "нажав" красный node вниз перед поиском node, поскольку мы поиск по дереву для node для удаления. Это может создать ненужные красные узлы, которые процедура fixUp() будет устранена на пути резервного копирования дерева. fixUp() предположительно поддерживает обычные инварианты LLRBT: "нет последовательных красных узлов" и "нет правых красных узлов".

Не уверен, помогает ли это, или если нам нужно более детально изучить код.

Ответ 2

Есть интересный комментарий о реализации Sedgwich и, в частности, его метод удаления от профессора Harvard Comp Sci. Левонасыщенные красно-черные деревья, считающиеся вредоносными, было написано в 2013 году (документ Sedgwich pdf, на который вы ссылаетесь выше, датирован 2008 годом):

Трудно писать

Бумага Sedgewicks сложна. Начиная с 2013 года, раздел вставки представляет 2-3-4 дерева по умолчанию и описывает 2-3 дерева в качестве варианта. Однако реализация delete работает только для 2-3 деревьев. Если вы реализуете вариант вставки по умолчанию и единственный вариант удаления, ваше дерево не будет работать. Текст не выделяет переключатель от 2-3-4 до 2-3: не kind.

Самая последняя версия, которую я могу найти в коде Sedgwich, который содержит реализацию 2-3, датируется апрелем 2014 года. Он находится на сайте Алгоритмы на странице RedBlackBST.java