Давайте предположим следующее определение красно-черного дерева:
- Это двоичное дерево поиска.
- Каждый узел окрашен в красный или черный цвет. Корень черный.
- Два узла, соединенные ребром, не могут быть одновременно красными.
- Здесь должно быть хорошее определение листа NIL, как на вики. Лист NIL окрашен в черный цвет.
- Путь от корня до любого листа NIL содержит такое же количество черных узлов.
Вопрос
Предположим , что вы внедрили insert
и delete
операции для красно-черного дерева. Теперь, если вам дано правильное красно-черное дерево, всегда ли есть последовательность insert
и delete
операции, которые его строят?
мотивация
Этот вопрос мотивирован этим вопросом и обсуждением этого вопроса .
Лично я считаю, что если вы представляете себе правильное красно-черное дерево, состоящее только из черных узлов (что подразумевает, что вы представляете себе идеально сбалансированное дерево), существует последовательность insert
и delete
операции, которые его строят. Тем не мение,
- Я не знаю, как точно доказать это
- Я также заинтересован в более общем случае
insert
иdelete
для построения корректного красно-черного дерева, состоящего только из черных узлов . Он использует вставки / делеции создать дерево высотой ч . Сначала мы можем создать идеально сбалансированное красно-черное дерево в ширину, используя 2 h + 1 - 1 вставки, затем используя h ∗ 2 h - 1insert
иdelete
операций?insert
иdelete
; может быть несколько способов сделать эти операции. б) Так как деревья RB по сути являются B-деревьями порядка 4, можно искать вдохновение. Детали могут оказаться хитрыми, поскольку отображение из RB в B (и / или в обратном направлении) не является уникальным.Ответы:
Операции вставки и удаления в красно-черном дереве включают балансировку, необходимую для поддержания красно-черных свойств.
Проблема с не наклоняющимися (левыми или правыми) красными черными деревьями заключается в том, что существует множество способов восстановить красную черноту после основного удаления или вставки.
Это не вставка или удаление, которое трансформирует дерево, а перебалансировка и вращение, которые происходят впоследствии, чтобы сохранить / восстановить красную черноту дерева.
Основное описание красно-черного дерева не предписывает, какой из возможных маршрутов выбрать.
Может оказаться невозможным выяснить, как точно реконструировать данное красное черное дерево, потому что перебалансировка не должна быть детерминированной.
Это было «решено» с левыми красно-черными деревьями.
Существует только один способ балансировки. Таким образом, любое заданное наклоняющееся красное черное дерево может быть реконструировано с использованием вставок и удалений, поскольку перебалансировка / ротация выполняются определенным детерминированным способом.
Это не означает, что левосторонние RB-деревья лучше или эффективнее, что они получают с одной стороны, используя детерминированные правила балансировки, а с другой - более сложный балансировочный код.
Согласно комментарию @ Антона:(h+2)⋅2h−1 h 2h+1−1 h∗2h−1 h раз самый низкий красный слой вверх по дереву, пока он не достигнет корня.
существует алгоритм, который использует операцию вставки и удаления для построения корректного красно-черного дерева, состоящего только из черных узлов. Он использует вставки / делеции создать дерево высотой ч . Во-первых, мы можем создать идеально сбалансированное красно-черное дерево в ширину, используя 2 часа.
Я думаю, что полный алгоритм балансировки, такой как Day-Stout-Warren, был бы более эффективным, хотя.
источник
insert
иdelete
из книги CLRS, вы можете построить действительное дерево RB, состоящее только из черных узлов . Хитрость заключается в том, чтобы вставить больше узлов, чем необходимо, а затем удалить лишние. Алгоритм будет устранить красные узлы.