На эту страницу http://www.eternallyconfuzzled.com/tuts/datastructures/jsw_tut_rbtree.aspx
«Удаление сверху вниз» представляет собой реализацию удаления узла из красно-черного дерева, который проактивно уравновешивает дерево, проталкивая красный узел вниз по дереву, так что удаляемый листовой узел гарантированно будет красным. Поскольку листовой узел гарантированно будет красным, вам не нужно беспокоиться о перебалансировке дерева, потому что удаление красного листового узла не нарушает никаких правил, и вам не нужно выполнять никаких дополнительных операций для восстановления баланса. сбалансировать и восстановить красно-черное.
«Удаление снизу вверх» включает в себя выполнение обычного двоичного поиска по дереву для поиска удаляемого узла, перестановку в листовом узле (если найденный узел не является листовым узлом), а затем восстановление красного свойства черного дерева, взбираясь на дерево и исправляя нарушения красно-черных правил.
Минимизирует ли удаление сверху вниз количество операций перебалансировки? Возможно ли, что удаление сверху вниз проактивно делает слишком много перекрашиваний и перебалансировок на пути вниз?
Как насчет этого сценария: (x) обозначает красный узел
8
_____/ \____
/ \
4 12
/ \ / \
2 6 10 14
/ \ / \ / \ / \
1 3 5 7 9 11 13 15
\
(16)
Если я захочу удалить 16, удаление снизу вверх не произведет никакой перебалансировки, но удаление сверху вниз перекрасит узлы до конца, прежде чем обнаружит, что операции перекраски не нужны:
итерация 1:
(8)
_____/ \____
/ \
4 12
/ \ / \
2 6 10 14
/ \ / \ / \ / \
1 3 5 7 9 11 13 15
\
(16)
итерация 2:
8
_____/ \____
/ \
(4) (12)
/ \ / \
2 6 10 14
/ \ / \ / \ / \
1 3 5 7 9 11 13 15
\
(16)
итерация 3:
8
_____/ \____
/ \
(4) 12
/ \ / \
2 6 (10) (14)
/ \ / \ / \ / \
1 3 5 7 9 11 13 15
\
(16)
Затем в итерации 4 вы обнаружите, что вам не нужно нажимать вниз, потому что 16 уже красный. Таким образом, удаление сверху вниз более эффективно по времени и пространству?