堆
堆是一种灵巧的、部分有序的数据结构,它适用于实现优先级队列。
堆定义
堆(heap):可以定义为一颗二叉树,且需要满足以下两个条件:
- 堆是一颗完全二叉树。
- 树中每一个节点的值都要大于或等于它子节点的值。
用数组实现堆
若想用数组实现堆,方法是用从上到下、从左向右的方式来记录堆元素。例如,我们在数组(H) 1~n 的位置上存放堆元素,那么数组中的元素将满足以下特性:
- 若父节点在数组中的位置为 i,那么它的左子节点的位置为 2i,右子节点的位置为 2i+1。相应地,对于一个位于 i 的 key 来说,它的父节点将会位于 i/2。
- 父节点位于数组中的前 i/2 位置,叶子节点位于数组中的后 i/2 位置。