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

Я учусь 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 для меня?

2 ответов


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

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

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

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

enter image description here

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

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

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


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

сложно писать!--7-->

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

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