根据此页面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 已经是红色的。那么自上而下的删除是否更节省时间和空间?