堆和树的数据结构实现差异

时间:2014-08-02 17:40:25

标签: data-structures tree heap binary-tree

所以我看到树通常被实现为一个列表,其中每个节点都是动态分配的,每个节点都包含指向其两个子节点的指针。

但是使用数组几乎总是实现堆(在教科书中推荐使用堆)。这是为什么?关于这两个数据结构的使用是否有一些潜在的假设?对于例如如果使用最小堆实现优先级队列,则队列中的节点数是常量,因此可以使用固定大小的数组来实现。但是,当您在谈论/教授一般堆时,为什么建议使用数组来实现它。或者翻一下这个问题为什么不建议使用数组实现有关树的学习?

1 个答案:

答案 0 :(得分:1)

(我假设堆是指二进制堆; other heaps几乎总是链接节点。)

二进制堆总是一个完整的树,它上面没有任何操作可以移动整个子树,或者以任何非平凡的方式改变树的拓扑结构。这不是一个假设,第一个是堆的定义的一部分,第二个是从操作的定义中立即明显的。

首先,由于Ahnentafel布局需要为每个内部节点(以及除最右边的节点之外的所有叶节点)保留空间,因此以这种方式实现的不完整树将浪费不存在的节点的空间。相反,对于完整的树,它是最有效的布局,因为所有空间实际上都用于节点数据,并且指针不需要空间。

其次,在数组中移动子树需要将所有子元素复制到新位置(因为左子索引始终是父索引的两倍,前者在后者更改时会发生变化,递归地到叶子)。当您通过指针链接节点时,无论这些指针下面的树有多大,您只需要移动几个指针。移动子树是许多树算法的核心组件,包括各种二叉搜索树。它需要快速闪电才能使这些算法高效。然而,二进制堆操作永远不需要这样做,因此它不是问题。