堆是一种特殊的树:
堆必须是一个完全二叉树,除了最后一层,其他层的节点个数都是满的,最后一层的节点都靠左排列。
堆中的每个节点的值必须大于等于(或者小于等于)其子树中每个节点的值。
对于每个节点的值都大于等于子树中每个节点值的堆叫“大顶堆”。
对于每个节点的值都小于等于子树中每个节点值的堆叫“小顶堆”。
对于同一组数据可以构建多种不同形态的堆。
堆是一种完全二叉树。它最大的特性是:每个节点的值都大于等于(或小于等于)其子树节点的值。因此,堆被分成了两类,大顶堆和小顶堆。
下图中1、2是大顶堆,3是小顶堆,4不是堆。

1570493298643
完全二叉树比较适合用数组来存储。用数组来存储完全二叉树,不需要存储左右子节点的指针,单纯地通过数组的下标,就可以找到一个节点的左右子节点和父节点。

1570493443825
上图中i=1存储根节点,下标为 i 的节点的左子节点就是下标为 i ∗ 2 的节点,右子节点就是下标为 i ∗ 2 + 1的节点,父节点就是下标为 $\frac{i}{2}$ 的节点。
如果i=0存储根节点,下标为 i 的节点的左子节点就是下标为 i ∗ 2 + 1 的节点,右子节点就是下标为 i ∗ 2 + 2的节点,但父节点的下标为$\frac{i-1}{2}$