优先队列,用二叉堆实现,元素在队尾追加,从队头删除。优先队列是怎么用二叉堆实现的呢?
首先了解几个概念:
- 堆有序:在数组中,每个元素大于等于两个特定位置的元素。二叉树中,每个父节点的值要大于等于两个子节点的值
- 完全二叉树:每个节点的子节点个数为2或0
- 二叉堆:是一组能用堆有序的完全二叉树排序的元素,并在数组中按照二叉树的层序遍历顺序保存。
如果要将上图的二叉堆元素(节点数为N)保存在数组中,则需要创建一个长为N+1的数组,第0个元素不用,使用[1~N]保存节点。上述二叉堆按照层序遍历保存到数组中为[-,T,S,R,P,N,O,A,E,I,H,G],在此数组中,位置为k的节点的父节点为[k/2],两个子节点分别为[2k][2k+1]。
接下来来实现优先队列的两个主要操作:- 插入元素
当有元素插入时放入堆数组的末尾,索引为k,如果当前元素大于其父节点[k/2],则需要和父节点交换位置,直至找到大于插入值的父节点为止,这种操作为“上浮”,即由下至上的堆有序化。
- 插入元素