За эту страницу http://www.eternallyconfuzzled.com/tuts/datastructures/jsw_tut_rbtree.aspx "Удаление сверху вниз" представляет собой реализацию удаления красного дерева node, которое активно балансирует дерево, нажимая красный node вниз по дереву, чтобы лист node, который удаляется, гарантирован быть красным. Поскольку лист node гарантированно будет красным, вам не нужно беспокоиться о повторной балансировке дерева, потому что удаление красного листа node не нарушает никаких правил, и вам не нужно выполнять никаких дополнительных операции по балансировке и восстановлению красно-черного цвета.
"Удаление снизу вверх" включает в себя выполнение нормального двоичного поиска по дереву, чтобы найти node для удаления, заменяя его на лист node (если найденный node не является листом node), а затем восстановление свойств красно-черного дерева путем восхождения на дерево при фиксации красно-черных нарушений правил.
Делает ли удаление сверху вниз минимизацию количества операций повторной балансировки? Возможно ли, что удаление сверху вниз проактивно делает слишком много повторных раскрасок и повторных балансировок на пути вниз?
Как насчет этого сценария: (x) обозначает красный node
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 уже краснеет. То есть удаление сверху вниз больше времени и пространства?