如果我们在root中放入15,那么heapify的过程是什么?
85
/\
/ \
/ \
55 70
/\ /\
/ \ / \
22 33 30 65
/\ /
14 15 15
从堆中删除85的方法应该是什么?
答案 0 :(得分:4)
因为你总是用两者中较大的一个交换它(堆属性意味着父元素总是大于它的子元素):
15
/\
/ \
/ \
55 70
/\ /\
/ \ / \
22 33 30 65
/\
14 15
70
/\
/ \
/ \
55 15
/\ /\
/ \ / \
22 33 30 65
/\
14 15
70
/\
/ \
/ \
55 65
/\ /\
/ \ / \
22 33 30 15
/\
14 15
答案 1 :(得分:1)
如果删除85并将其替换为15,则可以通过降低半堆将半堆转回堆中,即根处的15将沿着较大子节点的路径“下沉”。在这种情况下,它将与70交换,然后与65交换。
编辑:因为我们总是和更大的孩子交换,所以它确保我们最终得到一个有效的堆(例如,如果我们将15换成55代替70,那么我们将有70作为55的孩子,这是不好的)
答案 2 :(得分:0)
要添加你把新值作为最后一个(在你的例子中右边20),然后你尝试修复堆,比较它与他的父,如果它更大的交换和再次比较,直到没有交换需要(或你得到root)
为了删除你删除你替换最后一个对象(在你的例子中为15)并向下修复堆。
答案 3 :(得分:0)
要删除此处为root的85。