2

自下而上的堆构造不完全取决于 (n+1) 是 2 的幂这一事实吗?(其中 n 是节点数)。

例如,考虑 n = 21 的情况。 (n +1) 不是 2 的幂 - 这将如何工作?

您将创建第一个插入 (n+1)/2 个节点,即 11 个节点。然后,您将插入 (n+1)/4 个节点作为先前插入的节点的父节点,即 5.5 个节点。但是“半个节点”怎么插入呢?每当 n 不是 2 的幂时,您总是会在某个级别上获得十进制的节点插入量 - 您如何处理这个问题?

我考虑删除一定数量的节点,以便剩余节点是 2 的幂,从剩余节点中构建一棵树,然后在完成后将删除的节点冒泡到树中。但是对于大量节点,这变得不可行:即节点数 = 1600。最接近 2 的幂是 1024,这意味着您必须冒泡 576 个节点,这相对耗时。

4

1 回答 1

4

不,不需要发生这种情况。请记住,二叉堆的最后一层可能缺少节点。这意味着在第一步中,您以一种最终得到堆集合的方式组合节点,这样这些堆将形成堆的最后两层。并非所有这些堆都必须是完整的堆。他们中的一些人会有失踪的孩子。

如果您选择要省略的子节点数,使剩余节点数比 2 的完美幂少 1,则可以照常进行自下而上的构造。结果将是一个完整的二进制堆。

希望这可以帮助!

于 2012-07-06T00:57:28.730 回答