引用维基百科:
使用传统的二叉树数据结构来实现二叉堆是完全可以接受的。添加可以通过算法解决 的元素时,在二进制堆的最后一级找到相邻元素存在问题......
关于这种算法如何工作的任何想法?
我无法找到有关此问题的任何信息,因为大多数二进制堆都是使用数组实现的。
任何帮助表示赞赏。
最近,我注册了一个 OpenID 帐户,无法编辑我的初始帖子,也无法评论答案。这就是为什么我通过这个答案做出回应。非常遗憾。
引用米奇小麦:
@Yse:您的问题是“如何找到二进制堆的最后一个元素”?
是的。或者更准确地说,我的问题是:“如何找到非基于数组的二进制堆的最后一个元素?”。
引用抑制火:
你在问这个问题时有什么背景吗?(即,您是否正在尝试解决一些具体问题?)
如上所述,我想知道一种“找到基于非数组的二进制堆的最后一个元素”的好方法,这是插入和删除节点所必需的。
引用罗伊的话:
对我来说,使用普通的二叉树结构(使用定义为 [data, pLeftChild, pRightChild] 的 pRoot 和 Node)并添加两个额外的指针(pInsertionNode 和 pLastNode)似乎是最容易理解的。pInsertionNode 和 pLastNode 都将在插入和删除子例程期间更新,以在结构中的数据更改时保持它们的最新状态。这使 O(1) 可以访问结构的插入点和最后一个节点。
是的,这应该有效。如果我没记错的话,当它们的位置由于删除/插入而更改为另一个子树时,找到插入节点和最后一个节点可能会有点棘手。但我会试一试。
引用 Zach Scrivena 的话:
如何执行深度优先搜索...
是的,这将是一个很好的方法。我也会试试看。
我仍然想知道,是否有办法“计算”最后一个节点和插入点的位置。具有 N 个节点的二叉堆的高度可以通过取大于 N 的 2 的最小幂的对数(以 2 为底)来计算。也许也可以计算最深层次的节点数。然后有可能确定必须如何遍历堆才能到达插入点或删除节点。