【问题标题】:why are binary heaps a tree structure?为什么二叉堆是树结构?
【发布时间】:2023-01-11 14:07:51
【问题描述】:

二叉堆可以用数组表示,数组是一种线性数据结构,而树是一种非线性数据结构。这是否意味着使用数组表示的二叉堆不再是一棵树?

【问题讨论】:

  • 不,二叉堆始终是一棵树,无论您如何存储它。
  • 如何?我知道树是非线性数据结构,使用数组制作树意味着使用线性 ds 制作非线性 ds。
  • 请参阅此处以获得有用的解释:geeksforgeeks.org/binary-heap 特别是 geeksforgeeks.org/array-representation-of-binary-heap 即使在数组形式中,顺序/结构也始终很明显,如链接站点“用于实现数组表示的遍历方法是 Level Order”中所述,“Arr[(i-1)/2]返回父节点”,“Arr[(2*i)+1]返回左子节点”,“Arr[(2*i)+2]返回右子节点”

标签: java data-structures binary-heap


【解决方案1】:

答案是否定的,我们可以代表我们想要的方式,但它会是一棵树。重点来了,我们把二叉堆表示成数组的时候,是不是对二叉堆的所有属性没有限制。

【讨论】:

  • 如何?我知道树是非线性数据结构,使用数组制作树意味着使用线性 ds 制作非线性 ds。
  • @凯当然可以。为什么不?
【解决方案2】:

您混淆了模型——堆的概念视图——与实现。

二叉堆是在数组中实现的树。也就是说,我们分配一个固定的内存块并像引用树一样引用它。从概念上讲,这与我们实现二维数组的方式没有太大区别。

考虑声明为 a[3,4] 的二维数组。大多数语言将其分配为单个内存块——一个线性数组——大小为 12。但我们将其视为二维结构。编译器将我们的 2D 寻址转换为一维数组索引(假设行优先排序),如下所示:

 1 2 3 4 5 6 7 8 9 10 11 12
| Row 1 | Row 2 |  Row 3

所以 a[2,3] 解析为索引 7。

因为二叉堆是一棵完全二叉树,其中除最后一层外的所有层都是满的,而最后一层是左填充的(即所有空白空间都在最后一层的右侧),我们可以将树结构覆盖在数组的方式与我们覆盖二维数组的方式大致相同。

我们知道数组的第一个元素是堆的根。我们知道接下来的两个数组元素是根的子元素。接下来的四个元素是那些孩子的孩子,依此类推。所以在一个有 7 个节点的二叉堆中,我们有:

  • 索引 1 - 根节点
  • 索引 2 和 3 - 根节点的子节点
  • 索引 4、5、6、7 - root 的孩子的孩子 (4 和 5 是索引 2 处节点的子节点。6 和 7 是索引 3 处节点的子节点)。

二叉堆仍然是一棵树。与实现其他类型的树相比,我们只是利用我们对二叉堆特殊性质的了解来更有效地实现它。

【讨论】:

    猜你喜欢
    • 2016-12-20
    • 2011-11-28
    • 1970-01-01
    • 2014-10-01
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多