堆是一种特殊的树,需要满足以下两点要求:

  1. 堆是一个完全二叉树
  2. 堆中每一个节点的值都必须大于等于(或小于等于)其子树中每个节点的值 (根据大于等于和小于等于的不同分为大顶堆小顶堆

堆的应用

  • 优先级队列
  • Top K问题,维护一个大小为k的小顶堆,将元素与堆顶元素比较,如果比堆顶元素大,就用元素替换堆顶元素,然后进行堆化,最后堆中元素就是最大的k个元素。
  • 动态数组求中位数:维护一个大顶堆和一个小顶堆,大顶堆存储前半部分数据,小顶堆存储后半部分,且小顶堆的数据都大雨大顶堆的数据。当有新元素时,将其与大顶堆的堆顶元素比较,来决定新元素进行大顶堆还是小顶堆。