首页 > 学院 > 开发设计 > 正文

数据结构-堆

2019-11-08 03:07:00
字体:
来源:转载
供稿:网友

原文链接  点击打开链接

什么是堆

堆是一种特殊的二叉完全树。堆的一个主要特点是它以一定的偏序(a partial order)来保存所有节点[译者注:此处的偏序是指不完全的排序,堆只需要满足父节点大于两个子节点,而子节点之间没有要求]。作为一颗完全树,一层中的节点是从左到右填满的。如果一个节点没有左儿子,那么它一定没有右儿子。并且在第h层中如果存在节点,那么第h-1层必须是填满的。

 

以下是堆的正式定义(摘自Computer Algorithms by S. Baase and A. Van Gelder):

 

一个二叉树V是一个堆,当且仅当它满足以下条件:

V从根节点至h-1层是完全树所有的叶子节点只存在于h与h-1层上所有到达h层叶子节点的路劲都在到达h-1层叶子节点路径的左侧

堆有两种:最大堆和最小堆。最小堆中每个节点的优先级小于或者等于它的子节点;最大堆则相反,每个节点的优先级都大于或者等于它的子节点。

 

图示最大堆(左)和最小堆(右):

 

 

实现细节

CHeapTree类通过一个数组,从上至下、从左至右地保存树中的节点来实现堆。因此,上述图示中的最大堆就可以表示为10,9,8,6,1,5。在这种表示方式中,第j个节点的子节点和父节点的表达如下(假设起始索引值是0):

左子节点 = j*2-1右子节点 = j*2 = 左子节点+1父节点     = (j-1)/ 2

如果索引值越界,则该节点不存在。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表