Data structures 关于二进制堆数据结构的几个问题

Data structures 关于二进制堆数据结构的几个问题,data-structures,Data Structures,我一直在不同的网站和书籍上阅读,我有一些问题需要澄清 1:父节点的优先级是否总是高于其任一子节点的优先级 2:左同胞的优先级是否总是低于右同胞的优先级 3:每个关卡都满了吗,除了可能是最上面的关卡,它是正确加载的 4:每个级别都已满,但底部级别可能未加载。在了解堆之前,您应该了解完全二叉树(CBT)和几乎完全二叉树(ACBT)的定义 CBT和ACBT 完全二叉树:完全二叉树是一棵树,其中除叶子外的每个节点都有两个子节点 几乎完整的二叉树:在每个节点的给定二叉树中: 填充左子项后,只填充右子项。

我一直在不同的网站和书籍上阅读,我有一些问题需要澄清

1:父节点的优先级是否总是高于其任一子节点的优先级

2:左同胞的优先级是否总是低于右同胞的优先级

3:每个关卡都满了吗,除了可能是最上面的关卡,它是正确加载的


4:每个级别都已满,但底部级别可能未加载。

在了解堆之前,您应该了解完全二叉树(CBT)和几乎完全二叉树(ACBT)的定义

CBT和ACBT

完全二叉树:完全二叉树是一棵树,其中除叶子外的每个节点都有两个子节点

几乎完整的二叉树:在每个节点的给定二叉树中:

  • 填充左子项后,只填充右子项。
  • 填充当前级别后,只填充下一级别。
  • 现在,让我们看看二进制堆的定义:

    二进制堆是一个完整的二叉树或几乎完整的二叉树(所有级别都已完全填充,但最后一个级别可能已将所有键尽可能地左移,即左移加载)。此属性适用于在数组中存储堆

    二进制堆的类型:

    最大堆:给定ACBT或CBT中的;父根与子根相比最大或相等

    Min heap:在给定的ACBT或CBT中;比较其子节点时,父节点最小或相等

    这个解释将澄清你所有的问题,但让我为你总结一下

  • 优先权在这里不是问题。在这里,无论您遵循什么顺序(基于最大或最小堆),都必须为每个节点遵循。您需要记住的唯一一点是,在最大堆的情况下,父节点的最大值或等于其子节点的最大值,反之亦然。你不在乎左边或右边的孩子。这在二进制搜索树(BST)中得到了注意。

  • 所有级别都已满,但最后一个级别可能会尽可能保留所有键(我指的是子级键)

  • 在二进制堆中,如果堆是一个具有N个节点的完整二叉树,那么它具有最小的可能高度,即log2N


  • 有一种方法可以帮助您更好地了解堆。

    在了解堆之前,您应该了解完全二叉树(CBT)和几乎完全二叉树(ACBT)的定义

    CBT和ACBT

    完全二叉树:完全二叉树是一棵树,其中除叶子外的每个节点都有两个子节点

    几乎完整的二叉树:在每个节点的给定二叉树中:

  • 填充左子项后,只填充右子项。
  • 填充当前级别后,只填充下一级别。
  • 现在,让我们看看二进制堆的定义:

    二进制堆是一个完整的二叉树或几乎完整的二叉树(所有级别都已完全填充,但最后一个级别可能已将所有键尽可能地左移,即左移加载)。此属性适用于在数组中存储堆

    二进制堆的类型:

    最大堆:给定ACBT或CBT中的;父根与子根相比最大或相等

    Min heap:在给定的ACBT或CBT中;比较其子节点时,父节点最小或相等

    这个解释将澄清你所有的问题,但让我为你总结一下

  • 优先权在这里不是问题。在这里,无论您遵循什么顺序(基于最大或最小堆),都必须为每个节点遵循。您需要记住的唯一一点是,在最大堆的情况下,父节点的最大值或等于其子节点的最大值,反之亦然。你不在乎左边或右边的孩子。这在二进制搜索树(BST)中得到了注意。

  • 所有级别都已满,但最后一个级别可能会尽可能保留所有键(我指的是子级键)

  • 在二进制堆中,如果堆是一个具有N个节点的完整二叉树,那么它具有最小的可能高度,即log2N

  • 有一种方法可供您参考,以便更好地了解堆。

    来源:

    二进制堆定义为具有两个附加约束的二叉树:[3]

    • 形状属性:二叉堆是一个完整的二叉树;也就是说,除了最后一个(最深的)之外,树的所有级别都被完全填充,如果树的最后一个级别不完整,则该级别的节点从左到右填充
    • Heap属性:每个节点中存储的密钥大于或等于(≥) 或小于或等于(≤) 节点子节点中的键,按照总顺序排列
    关于你的问题:

    1:父节点的优先级是否总是高于其任一子节点的优先级

    在最大堆中,父节点的优先级始终大于或等于其子节点的优先级

    2:左同胞的优先级是否总是低于右同胞的优先级

    绝对不是!以下两个都是有效的最大堆:

      3           3
     / \         / \
    2   1       1   2
    
    在维护Shape属性的同时,试图维护左、右子元素的顺序是一件愚蠢的事情。这是可以做到的,但要付出极大的效率代价

    对于问题3和问题4,请参见上面关于形状属性的讨论。特别是

    3:每个关卡都满了吗,除了可能是最上面的关卡,它是正确加载的

    没有

    4:每一层都满了吗,除了可能是底部的层,它是左载的