堆与优先队列概念

427 阅读2分钟

这是我参与8月更文挑战的第12天,活动详情查看:8月更文挑战

之前刷了关于二叉树的题,有兴趣的小伙伴冲向我的主页,今天刷刷堆和优先队列的题~~

首先我们来了解下什么是堆?

一、堆

堆是一颗完全二叉树,且每个节点都大于其左右节点或者每个节点都小于其左右节点。

堆中有大顶堆和小顶堆。

  • 大顶堆:每个节点都大于其左右节点。

image.png

  • 小顶堆:每个节点都小于其左右节点。

image.png

二、完全二叉树

完全二叉树:若设二叉树的深度为k,除第 k 层外,其它各层 (1~k-1) 的结点数都达到最大个数,第k 层所有的结点都连续集中在最左边,这就是完全二叉树。

微信图片_20210812120731.png 上图的完全二叉树用数组表示:[1,2,3,4,5,6]

完全二叉树的性质:

  1. 完全二叉树的叶子节点个数 等于 总节点数/2(向上取整)。
  2. 完全二叉树的高 等于 log2log2 n + 1

三、用堆实现优先队列

普通队列和优先队列的对比: image.png

从上图可看出优先队列的特点,可以用堆来实现优先队列。

插入元素时上浮

当有元素插入时放入堆数组的末尾,索引为k,如果当前元素大于其父节点[k/2],则需要和父节点交换位置,直至找到大于插入值的父节点为止,这种操作为“上浮”,即由下至上的堆有序化。

删除最大元素时下沉 根据二叉堆的性质可知,根节点就是整个堆的最大元素,所以可以在数组的顶端删除最大元素,然后将数组最末尾的元素放入顶端,因为此时根节点比两个子节点或两个子节点之一更小,所以需要和两个子节点中的较大者进行交换,直至找到两个子节点都比它小或到达底部,这种操作为“下沉”,即自顶向下的堆有序化。