堆(heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质:
- 堆中某个结点的值总是
不大于
或不小于
其父结点
的值; - 堆总是一棵
完全二叉树
。
将根结点
最大的堆叫做最大堆
或大根堆
,根结点
最小的堆叫做最小堆
或小根堆
。
数组实现堆
对于一个完全二叉树来说,用数组来存储是非常节省存储空间的。因为我们不需要存储指向左右子节点的指针,单纯的通过数组下标就可以找到一个节点的左右子节点和父节点。如下图所示。
对于数组中下标为 n 的节点来说, 这里的 n 从 1 开始算, 那么:
- 左子节点的索引是 2n
- 右子节点的索引是 2n+1
- 父节点的索引满足 n/2