本节以小根堆为例子进行插入和删除
image.png

在堆中插入新元素

image.png
有如下一个小根堆
image.png
首先插入关键字13
第一步将待插队的元素放表尾
image.png
将新的结点与父节点相比较,如果比父节点小则互换,反之则位置不变。此时13比其父节点(32)小,则进行互换。
image.png
交换后再次和当前的父节点进行比较,此时13比当前父节点(17)小,则互换两个的位置。
image.png
交换后再次和当前的父节点进行比较,此时13比当前父节点(9)大,则不需要互换。
上面插入13的过程,一共进行了三次关键字的对比。

再插入46
将46放在表尾
image.png
比较46和父节点(45)的值,父节点的值小于46因此不进行交换。插入结束。
上面插入46的过程,一共进行了一次关键字的对比。

在堆中删除一个元素

被删除的元素用堆底元素代替,让后对该元素与其孩子进行比较,如果该元素大于左右孩子最小的一个则将该元素与这个孩子互换。
image.png
比如上边的小根堆中删除元素13后,使用46代替该位置如下:
image.png
46与其孩子结点进行对比,大于最小的左孩子结点的值(17),则左孩子互换。
image.png
再与交换后的孩子结点进行对比,大于其右孩子结点(32),与其交换
image.png
到此,完成了对堆的调整。
删除13的过程,一共进行了四次关键字的对比。

再比如在上面基础上删除65,依然使用堆底元素(46)代替被删除位置。
image.png
再对46进行调整,让它和其孩子结点进行对比,发现均小于左右孩子结点,则不需要进行调整。
删除62的过程,一共进行了两次关键字的对比。

总结

image.png