若有看到这篇文章的小伙伴发现有内容错误,请告诉我改正。
一、堆
1)概念:堆是一种特殊的树。需要满足两个条件:
①树必须是完全二叉树。
②树的每个节点都必须大于等于(或小于等于)其左右子树任意一个节点的值。
2)分类:
①大顶堆:每个节点都必须大于等于其左右子树任意一个节点的值。
②小顶堆:每个节点都必须小于等于其左右子树任意一个节点的值。
3)存储结构:
主要是以顺序结构进行存储,即使用数组。

节点存放在i的位置,其左节点存放位置为2i,其右节点存放位置为2i+1。
4)堆化:
当向堆中插入元素就是向数组的数据末位添加,在添加完后要继续满足堆的两个特性,就需要继续进行调整,这个调整的过程称为堆化。
堆化有两种:从上往下、从下往上。
5)操作:
①插入:以大顶堆为例。步骤:
①将插入元素添加到堆的尾部,即将插入元素添加到数组的最后。
②进行堆化操作。具体为,将插入元素与尾部元素的父节点进行比较,若插入元素大于父节点,调换。
③继续执行步骤②,直至插入完成为止。

这里使用的堆化就是从下往上。
②删除堆顶元素:以大顶堆为例。步骤:
①将删除元素与堆中最后一个元素互换。
②除删除元素之外的所有元素进行堆化操作。
问题:如果不执行步骤①,之间进行步骤②会发生什么?
从图中可以看出,最后形成的树不是完全二叉树,那么它就不是堆。
正确删除:
6)时间复杂度:
堆操作的时间复杂度为O(logn)。

被折叠的 条评论
为什么被折叠?



