如何从Max-Heap中删除?

时间:2011-07-10 09:53:01

标签: heap binary-search-tree

如果我们在root中放入15,那么heapify的过程是什么?

            85
            /\
           /  \
          /    \
        55      70
        /\      /\
       /  \    /  \
      22  33  30  65
     /\   /
   14 15 15

从堆中删除85的方法应该是什么?

4 个答案:

答案 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。

  1. 您可以替换为最后一个叶子( 15 )。
  2. 再次堆砌link to build heap