堆与二叉树-如何实现?

问题描述 投票:9回答:7

[实现堆结构时,我们可以将数据存储在数组中,以使位置i处的节点的子代位于位置2i和2i + 1。

我的问题是,为什么我们不使用数组表示二进制搜索树,而是处理指针等?

谢谢

arrays data-structures pointers heap binary-tree
7个回答
7
投票

如果所有子代的位置都像这样静态地预先计算,则该数组本质上表示一个完全完整,完全平衡的二叉树。

并非“现实生活”中的所有二叉树都完全充满和完美平衡。如果您碰巧有几个特别长的分支,则必须使整个数组更大,才能容纳最底层的所有节点。

  • 如果数组绑定的二叉树大部分为空,则浪费了大部分数组空间。

  • 如果只有一些树的分支足够深,可以到达阵列的“底部”,那么还会浪费很多空间。

  • 如果树(或仅一个分支)需要增长得“更深”,而不是数组的大小所允许,那么就需要“增长”该数组,通常将其实现为复制到更大的数组。这是一项耗时的操作。

因此:使用指针使我们能够动态灵活地扩展结构。在数组中表示树是一种很好的学术练习,并且对于小型和简单的案例都适用,但是通常不能满足“真实”计算的需求。


7
投票

个人

  1. 因为使用指针更容易扩大数据结构的大小动态

  2. 我发现维护bin更容易树胜于堆

  3. 在树中平衡,删除,插入元素的算法将仅更改指针,而不会像矢量中那样物理移动。

依此类推...


6
投票

主要是因为递归树允许非常简单的代码。如果将树展平为一个数组,代码将变得非常复杂,因为您必须做很多记账工作,而递归算法会为您做这件事。

[另外,高度为N的树可以在N和2^(N+1)-1个节点之间有任何东西(。只有实际的节点才需要内存。如果使用数组,则必须始终为所有节点(甚至是空节点)分配空间,除非您使用稀疏数组(这将使代码更加复杂)。因此,虽然很容易在内存中保留高度为100的稀疏树,但是找到可以分配20282409603651670470423947251286008字节RAM的计算机将是一个问题。


2
投票

要将元素插入堆中,可以将其放置在任何位置,并与其父元素交换它,直到堆约束再次有效为止。与父代交换是保持堆的二叉树结构完整的操作。这意味着大小为N的堆将表示为N单元数组,并且您可以在对数时间添加新元素。


0
投票

据我所知,我们可以使用Array表示二进制搜索树。但是使用指针更加灵活。


0
投票

基于数组的实现非常有用,如果您需要在图算法中用作优先队列的堆。在这种情况下,堆中的元素是常量,则弹出最上面的元素并插入新元素。删除顶部元素(或最小元素)需要进行一些重新平衡,以再次成为堆,这可以使数组达到合理的平衡。


0
投票

堆数据结构是一个完整的二叉树,与BST不同。因此,对于BST,使用数组没有多大用处。

© www.soinside.com 2019 - 2024. All rights reserved.