二叉堆(优先队列)

【0】README

0.1) 本文总结于 数据结构与算法分析,但源代码均为原创;旨在理清二叉堆(优先队列) + 堆的其他操作及其应用, 以便让朋友些知道为什么要学习优先队列;


##**【1】二叉堆** **1.0)优先队列定义:**优先队列是允许至少下列两种操作的数据结构,**insert(插入)**, 它的工作时显而易见的,以及 **deleteMin(删除最小者)**, 它的工作是找出、返回和删除优先队列中最小的元素; **1.1)**我们把二叉堆中只叫做堆, **堆也有两个性质:**结构性和堆序性;对堆的 insert and deleteMin 操作必须要到堆的所有性质都被满足时才能终止; **1.2)结构性质**
  • 堆是一棵被完全填满的二叉树,其底层上的元素从左到右填入,这样的树称为 完全二叉树;完全二叉树 的高是 logN(向下取整), 显然它是 O(logN);
    这里写图片描述
  • 堆数据结构将由一个数组(不管关键字是什么类型)、一个代表最大值的整数及当前的堆大小组成;

1.3) 堆序性质

  • 1)堆序性:使操作被快速执行的性质是 堆序性;由于我们想要快速找出最小元,因此最小元应该在根上;依据树的递归定义,则任意节点就应该小于它的后裔;

【2】基本的堆操作

2.1)insert 插入:为将一个元素X 插入到堆中, 在下一个空闲位置创建一个空穴, 否则该堆将不是完全树;如果X 可以放在该空穴中而并不破坏堆的序, 那么插入完成, 否则, 我们把空穴的父节点上的元素移入该空穴中;(这种一般策略叫做 上滤, 新元素在堆中上滤直到找出正确的位置);
这里写图片描述
2.2)deleteMin(删除最小元):找出最小元容易,困难是删除它;当删除一个最小元时, 在根节点处产生了一个空穴, 由于现在堆少了一个元素,因此对中最后一个元素 X 必须移动到堆的某个地方;如果X 可以被放到空穴中,那么 deleteMin 完成;显然这一般不可能, 因此我们将空穴中的较小者移入空穴, 这样就把空穴向下推了一层;重复该步骤直到 X 可以被放入空穴中;因此,我们的做法是将 X 置入沿着从根开始包含最小儿子的 一条路径上的一个正确的位置;(这种策略叫做下滤);
这里写图片描述
这里写图片描述
2.3)出现的问题+解决方法

  • 出现的问题:在堆实现中, 经常发生的错误是当堆中存在偶数个元素的时候, 此时将遇到一个节点只有一个儿子的情况, 我们必须保证假设节点不总有两个儿子;
  • 解决方法:始终保证你的算法把每一个节点都看成有两个儿子;

【3】源代码+printing

3.1)download source code :
https://github.com/pacosonTang/dataStructure-algorithmAnalysis/tree/master/chapter6
3.2)代码详情+打印效果参见

http://blog.csdn.net/PacosonSWJTU/article/details/49498255
“【2】source code+printing”部分,因为二叉堆(优先队列)的基本操作 和 其他高级的应用操作的实现代码我都放到一起的;

原文地址:https://www.cnblogs.com/pacoson/p/4922033.html