根据此页面 http://www.eternallyconfuzzled.com/tuts/datastructures/jsw_tut_rbtree.aspx,“自顶向下删除(Top-down deletion)”是红黑树节点删除的一种实现,通过将红色节点沿着树向下推送,使得要删除的叶子节点保证为红色,从而主动平衡树。由于保证要删除的叶子节点为红色,因此不需要担心再次平衡树,因为删除红色叶子节点不违反任何规则,也不需要执行任何额外的操作来重新平衡和恢复红黑'ness。
“自底向上删除(Bottom-up deletion)”涉及在树中进行正常的二进制搜索以找到要删除的节点,在交换叶子节点(如果找到的节点不是叶子节点)后,通过向上爬树并修复红黑规则违规来恢复红黑树属性。
自顶向下的删除是否最小化了重新平衡操作的数量?自顶向下的删除是否可能在向下过程中主动进行了过多的重新着色和重新平衡操作?
那么这种情况呢:(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)
然后在第四次迭代中,您发现不需要向下推,因为16已经是红色的。所以自顶向下的删除更节省时间和空间吗?