参考书籍《数据结构与算法分析——C语言描述》
普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先被访问。(引用百度百科)而堆则正是这种优先队列的具体实现。
堆(二叉堆):是一棵完全被填满的二叉树,有可能的例外是在底层,底层上的元素从左到右填入,这样的树被称为完全二叉树。最大堆和最小堆是二叉堆的两种形式。
最大堆:根结点的键值是所有堆结点键值中最大者,并依次递归下去,即子树的键值均小于父亲的键值。
最小堆:根结点的键值是所有堆结点键值中最小者,并依次递归下去,即子树的键值均大于父亲的键值。
d-堆:是二叉堆的简单推广,它恰像一个二叉堆,只是所有的节点都有d个儿子,因此,二叉堆是2-堆。
左式堆:对于堆中的每一个节点X,左儿子的零路径长至少与右儿子的零路径长一样大。左式堆除了保留堆的二叉树属性和最小堆属性外,有一个特征属性:任意节点的左孩子的零路径长(Npl)大于等于右孩子的Npl。这个特性决定了左式堆的不平衡性,并且明显左边会比较深,这就是左式堆的得来。由这个性质和上面提到的性质可以得到:左式堆任意结点的Npl为右孩子的Npl+1.
那么什么又叫零路径长呢?
零路径长Npl:从X到一个没有两个儿子的节点的最短路经长。因此,具有0个或1个儿子的节点的Npl为0。
在下图中:零路径长标记在树的节点内