【问题标题】:What are nearly complete binary trees?什么是近乎完全的二叉树?
【发布时间】:2020-05-15 07:09:30
【问题描述】:

我已经在网上阅读了很多关于“堆”的定义,并且我也阅读了 CLRS 中的定义。网上的大多数定义似乎都说堆是完全二叉树;但是,CLRS 以以下句子开始堆章节:

(二进制)堆数据结构是我们可以查看的数组对象 作为一个近乎完整的二叉树...

我不知道为什么,但 CLRS 称堆“几乎完成”,而我读过的几乎所有其他“堆”定义都称堆“完成”,这让我很困扰。

这让我想到了以下问题:是否有可能有一个不是完整二叉树的堆?

【问题讨论】:

  • 看起来他们在这里定义了一个“完全二叉树”,就像通常定义为一个“完美二叉树”一样。
  • 我就是这么想的,但我只是想确定一下。谢谢! @WillemVanOnsem
  • 当完成是指一棵树,其中左子树必须在右子树之前完成,是的,堆是完整的二叉树。

标签: algorithm data-structures heap


【解决方案1】:

complete 到底是什么意思?人们有不同的看法。在堆的上下文中,complete 二叉树应该意味着树的最后一层具有最大节点数。

任何在其最后一级没有最大叶子的堆不是complete 或nearly complete。

例如,一个有 7 个元素的堆是complete 二叉树。但是具有 4、5 或 6 个元素的堆不会完全填满最后一层,即 nearly complete。

具有Nearly complete 深度为三的二叉树(假设根节点的深度为 1)的堆如下所示:

【讨论】:

  • 嗯,一棵完整的树不是这样定义的。正如 Wikipedia 所指定的:“在完整的二叉树中,除了可能的最后一层之外,每一层都被完全填充,并且最后一层中的所有节点都尽可能远离。”。因此,最后一层本身并没有最大的叶子数。参考:en.wikipedia.org/wiki/Binary_tree
  • 是的,同意。在complete 上进行了更详细的编辑。
【解决方案2】:

您对“几乎完成”的表达感到困扰是绝对正确的。根据最常用的术语,堆是一棵完全二叉树:

  • 完全二叉树:除最后一层外都被占满,最后一层的叶子 级别出现在该级别的左侧。

  • 完美二叉树:一棵完全二叉树,其中最后一层也被完全占用。

  • 完全二叉树:一种二叉树,其中没有一个节点只有一个孩子。有时这个术语被用来表示完美的二叉树,增加了混乱。

完美二叉树也是完全二叉树和完全二叉树,但完全二叉树可能是也可能不是完全二叉树。

但是Binary tree 上的维基百科文章警告:

一些作者使用术语 complete 来指代一个 完美 二叉树 [...] 在这种情况下,他们称这种类型的树(可能不是填充最后一层)一棵几乎完全的二叉树或几乎完全的二叉树。

显然你所指的文字的作者属于这一类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-24
    • 2019-07-02
    • 2013-01-23
    • 1970-01-01
    相关资源
    最近更新 更多