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

为什么二进制堆必须是一棵完整的二叉树?

倪德业
2023-03-14

堆属性说:

如果A是B的父节点,则节点A的键相对于节点B的键进行排序,并在堆中应用相同的排序。要么父节点的键总是大于或等于子节点的键,最高键在根节点(这种堆称为最大堆),要么父节点的键小于或等于子节点的键,最低键在根节点(最小堆)。

但是为什么在这个wiki中,二进制堆必须是一个完整的二叉树呢?在我的印象中,堆属性并不意味着这一点。

共有3个答案

岳英耀
2023-03-14

如果树是完整的,您只能保证O(log(n))插入和(root)删除。原因如下:

如果树不完整,那么它可能是不平衡的,在最坏的情况下,它只是一个链表,需要O(n)来找到一个叶子,O(n)来插入和删除。根据完整性的形状要求,您可以保证执行O(log(n))操作,因为查找一个叶(数组中的最后一个)需要恒定的时间,并且您可以保证树的深度不超过log2(n),这意味着“冒泡”(用于插入)和“下沉”(用于删除)最多需要对堆中的数据进行log2(n)次修改(交换)。

这就是说,你不一定要有一个完整的二叉树,但你只是失去了这些运行时保证。此外,正如其他人所提到的,拥有一个完整的二叉树可以很容易地以数组格式存储树,而不用对象引用表示。

郑声
2023-03-14

数组中的每个项目在二叉树中都有一个位置,这个位置是根据数组索引计算的。定位公式确保树“紧密包装”。

例如,这里的二叉树:

由数组表示

[1, 2, 3, 17, 19, 36, 7, 25, 100].

注意,数组是有序的,就好像从树的顶端开始,然后从左到右读取每一行。

如果您向该数组添加另一个项目,它将表示19下方和100右侧的插槽。如果这个新数字小于19,那么值将不得不交换,但尽管如此,这是将由数组第10项填充的插槽。

聂季同
2023-03-14

根据您提供的维基百科文章,二进制堆必须符合堆属性(如您所讨论的)和形状属性(要求它是一个完整的二叉树)。如果没有形状属性,就会失去数据结构提供的运行时优势(即完整性确保在删除元素时有一个明确定义的方法来确定新根,等等)。

 类似资料:
  • 我有一个很严重的问题,就是在一棵树中重复搜索子树。 我试过了,但是。。。 似乎没有正确的形式。containsTree函数在找到与另一个节点不同的节点时停止搜索。 下面是两棵树的例子。 在这种情况下,当函数比较右边的子树和左边的子树时,当find等于父节点但它有不同的子节点时,它会停止搜索。我需要函数不要停止搜索,而是抛出这一点,搜索所有其他子节点及其子树。

  • 下面给出了二叉树的实现。 如图中所示,树不是完整的二叉树。如何编写一个函数,将上述二叉树转换为完整的二叉树,只需将字符串数据节点添加到没有子节点的节点,即可生成完整的二叉树。 我将手动在代码中添加节点,以获得如下结果树: 但是,如何编写一个函数,它将采取根节点和返回树,这是完整的二叉树。

  • 主要内容:二叉树的性质,满二叉树,完全二叉树,总结通过《 树的存储结构》一节的学习,我们了解了一些树存储结构的基本知识。本节将给大家介绍一类具体的树结构—— 二叉树。 简单地理解,满足以下两个条件的树就是二叉树: 本身是有序树; 树中包含的各个节点的度不能超过 2,即只能是 0、1 或者 2; 例如,图 1a) 就是一棵二叉树,而图 1b) 则不是。 图 1 二叉树示意图 二叉树的性质 经过前人的总结,二叉树具有以下几个性质: 二叉树中,第 i

  • 问题内容: 我对二叉树有一些疑问: Wikipedia指出,当“完整的二叉树是其中所有级别(可能除了最后一个级别)均已完全填充且所有节点都位于最左侧”的二叉树时,该二叉树即已 完成 。最后的“越远越好”的段落是什么意思? 如果(1)它是空的,或者(2)它的左右子级是平衡的,并且左树的高度在以下高度的1之内,则格式正确的二叉树被称为“高度平衡”。正确的树,取自如何确定二叉树是否平衡?,这是正确的还是

  • 考虑二叉树,其中每个节点要么是叶,要么正好有两个子节点(左和右,我们认为不同)。在节点上有多少不同的树 例如: -3个节点-

  • 本文向大家介绍C语言判定一棵二叉树是否为二叉搜索树的方法分析,包括了C语言判定一棵二叉树是否为二叉搜索树的方法分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C语言判定一棵二叉树是否为二叉搜索树的方法。分享给大家供大家参考,具体如下: 问题 给定一棵二叉树,判定该二叉树是否是二叉搜索树(Binary Search Tree)? 解法1:暴力搜索 首先说明一下二叉树和二叉搜索树的区别。二