简单说-堆

堆(heap) 又被为 优先队列(priority queue) 。尽管名为优先队列,但堆并 不是 队列。队列是按照进入队列的先手顺序来取元素,而堆是按照优先级(键值大小,父节点键值大于等于子节点键值为最大堆, 父节点键值小于等于子节点键值为最小堆)来取元素。

堆的一个经典的实现是 完全二叉树(complete binary tree) 。这样实现的堆称为 二叉堆(binary heap)

为了满足完全二叉树的要求, 该二叉树的前n-1层必须填满,第n层也必须按照从左到右的顺序被填满
为了满足堆(最小堆)的要求  任意节点的优先级高于等于它的子节点(键值小的设为优先级高)
插入节点或者删除节点操作会破坏堆的以下特性,因此需要在插入或者删除操作之后做相应的操作,以恢复堆的特性。
1. 完全二叉树 2. 每个节点值都小于或等于它的子节点。

此处使用最小堆
插入 操作的时候,会破坏上述堆的性质,所以需要进行名为 percolate_up 的操作,以进行恢复。新插入的节点new放在完全二叉树最后的位置,再和父节点比较。如果new节点比父节点小,那么交换两者。交换之后,继续和新的父节点比较…… 直到new节点不比父节点小,或者new节点成为根节点。这样得到的树,就恢复了堆的性质。

删除 操作只能删除根节点。根节点删除后,我们会有两个子树,我们需要基于它们重构堆。进行 percolate_down 的操作: 让最后一个节点last成为新的节点,从而构成一个新的二叉树。再将last节点不断的和子节点比较。如果last节点比两个子节点中小的那一个大,则和该子节点交换。直到last节点不大于任一子节点都小,或者last节点成为叶节点。

完全二叉树可以用数组表示, heap[0] : total nodes in the heap  
for a node i, its children are i*2 and i*2+1 (if exists)   its parent is i/2

详见http://blog.csdn.net/dingzhihui123/article/details/51598304点击打开链接

你可能感兴趣的:(数据结构与算法)