堆的概念

堆是满足一下性质的树:

  • 堆中某个节点的值总是不大于或不小于其父节点的值
  • 堆总是一棵完全二叉树

堆的分类

根据堆的节点大小关系,分为大根堆和小根堆。大根堆中每个节点都比它的子节点大,小根堆则是每个节点都比它的两个子节点小

大根堆示意图

小根堆示意图

在数组中储存的下标特征

在储存堆的时候,一个节点如果下标是 那么它的父节点的下标是 。左子节点的下标是 ,右子节点的下标是 。

堆的操作

以下操作均以大根堆为例

堆的插入

  1. 每次把一个节点放到数组的最后
  2. 依次比较它和其父节点的值,如果父节点更小,那么使用 shift up 操作,把当前节点和父节点交换,然后向上递归
  3. 如果父节点已经比此时调整的调整节点大了,调整结束
    时间复杂度是 级别的。

堆的删除

堆只支持删除堆顶端的元素

  1. 找到最后一个插入的元素
  2. 将最后一个元素和顶部的元素互换
  3. 向下递归调整进行 shift down

相关文章

[[Bachelor/DataStructure/Leftist heap]]