我已经在线阅读了许多有关“堆”的定义,并且还阅读了CLRS中的定义。在线上的大多数定义似乎都说堆是完整的二叉树。但是,CLRS使用以下句子开始堆章节:
(二进制)堆数据结构是我们可以查看的数组对象 作为几乎完整的二叉树...
我不确定为什么,但是CLRS称堆“几乎完成”确实使我感到困扰,而我读过的几乎所有其他“堆”定义都称堆为“完成”。
这引出了以下问题:是否有可能不是完整的二叉树的堆?
答案 0 :(得分:3)
complete
到底是什么意思?人们有不同的意见。在堆的上下文中,complete
二叉树应表示树的最后一级具有最大数量的节点。
任何在最后一级没有最大叶子数的堆都不是complete
或nearly complete
。
例如,具有7个元素的堆将是complete
二叉树。但是包含4、5或6个元素的堆不会完全填充其最后一个级别,即nearly complete
。
具有Nearly complete
二阶深度为三的二叉树(假定根节点的深度为1)的堆如下所示:
答案 1 :(得分:3)
您绝对对表达式“几乎完成”感到困扰。根据最常用的术语,堆是一个完整的二叉树:
完整的二叉树:除了最后一个级别以外的所有树都被完全占用,并且最后一个叶子 级别显示在该级别的左侧。
完美的二叉树:完整的二叉树,其中最后一层也被完全占用。
完整的二叉树:一棵二叉树,其中所有节点都没有一个子节点。有时,该术语用于表示完美的二叉树,这增加了混乱。
完美的二叉树也是完整的和完整的二叉树,但是完整的二叉树可能是也可能不是完整的二叉树。
但是Binary tree上的Wikipedia文章警告:
有些作者使用术语 complete 来代替 perfect 二叉树[...],在这种情况下,他们称这种树为树(可能没有填充到最后一级)几乎完整的二叉树或几乎完整的二叉树。
显然,您所引用文字的作者属于该类别。