当前位置: 首页 > 知识库问答 >
问题:

如何插入到实现为二叉树的二进制最大堆中?

海灵均
2023-03-14

在作为二叉树实现的二进制最大堆中(其中每个节点存储指向其父节点、左子节点和右子节点的指针),如果有指向堆根的指针,将如何实现插入操作?应该发生的是节点首先作为最后一行的最后一个元素被插入。对于基于数组的实现,您可以添加到数组中,但是对于基于树的实现,您如何找到正确的位置呢?

共有3个答案

贺雪松
2023-03-14

为了找到新节点应该插入的确切位置,我们使用二进制堆大小的二进制表示。这需要O(log N),然后我们把它泡起来,它需要O(log N)。所以插入操作需要O(log N)…有关详细解释,请查看我博客中关于二进制堆的文章-

http://theoryeofprogramming . com/2015/02/01/binary-heaps-and-heap sort-algorithm/

我希望这对你有帮助,如果有,请告诉我…!☺

赵经国
2023-03-14

如果您将新顶点挂在树的任何一片叶子下(作为左边或右边的后继者,没有关系),然后从这个新顶点到顶部修复堆(也就是说,对于每隔一个有后继者的顶点,如果需要,与更大的后继者交换并向上爬),您的新元素将找到它的正确位置,而不会破坏堆。然而,这只能保证每隔一次插入操作花费O(h)时间,其中h是树的最大高度。显然,最好将heap表示为一个数组,因为这样可以保证每个插入操作花费O(logN)时间。

充培
2023-03-14

在这个老问题中,我给出了一个简短的算法,它使用数字k的二进制表示,以便在自顶向下遍历中找到从二进制堆中选择第k个节点的方法。假设您跟踪二进制堆的显式树表示中的节点数量,您可以执行以下操作来执行插入操作:

  1. 使用上面的算法,确定新节点应该去哪里,然后在那个位置插入节点。
  2. 通过重新连接树以与其父节点交换,或者通过交换节点及其父节点的数据字段,直到元素处于其最终位置,不断向上冒泡节点。

希望这有帮助!

 类似资料:
  • 本文向大家介绍Python3实现二叉树的最大深度,包括了Python3实现二叉树的最大深度的使用技巧和注意事项,需要的朋友参考一下 问题提出: 给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。 说明: 叶子节点是指没有子节点的节点。 解决思路:递归法求解。从根结点向下遍历,每遍历到子节点depth+1。 代码实现( ̄▽ ̄): 时间和空间消耗: 以上就是本文的

  • 二叉搜索树(BST)和二叉树(BT)中的插入有什么区别?我知道,在BST中,您将新节点的值与根进行比较,如果较小,则添加到其左侧,如果较大,则将其添加到根的右侧。BT的程序是否相同?如果没有,插入和移除的步骤是什么?

  • 我最近完成了一个项目的二进制搜索树,我正在工作。很顺利,我学到了很多。然而,现在我需要实现一个常规的二叉树...出于某种原因,这让我难倒了。 我正在寻找一种方法来做我的InsertNode功能... 通常在BST中,您只需检查数据 有谁能帮我实现一个函数,只需将一个新节点从左到右不按特定顺序添加到二叉树中? 以下是我的BST插页:

  • 6.10.1.结构属性 为了使我们的堆有效地工作,我们将利用二叉树的对数性质来表示我们的堆。 为了保证对数性能,我们必须保持树平衡。平衡二叉树在根的左和右子树中具有大致相同数量的节点。 在我们的堆实现中,我们通过创建一个 完整二叉树 来保持树平衡。 一个完整的二叉树是一个树,其中每个层都有其所有的节点,除了树的最底层,从左到右填充。 Figure 1 展示了完整二叉树的示例。 Figure 1 完

  • 我将完整子树定义为所有级别都已满且最后一个级别左对齐的树,即所有节点都尽可能左对齐,我希望找到树中最大的完整子树。 一种方法是对每个节点作为根执行这里概述的方法,这将花费O(n^2)时间。 有更好的方法吗?

  • 堆属性说: 如果A是B的父节点,则节点A的键相对于节点B的键进行排序,并在堆中应用相同的排序。要么父节点的键总是大于或等于子节点的键,最高键在根节点(这种堆称为最大堆),要么父节点的键小于或等于子节点的键,最低键在根节点(最小堆)。 但是为什么在这个wiki中,二进制堆必须是一个完整的二叉树呢?在我的印象中,堆属性并不意味着这一点。