我一直在不同的网站和书籍上阅读,我有一些问题需要解决。
1:父节点的优先级是否总是高于其任一子节点的优先级?
2:左兄弟的优先级总是低于右兄弟的优先级吗?
3:每个级别都满了吗?可能除了最上面的级别,它是正确加载的吗?
4:每个级别都满了吗?除了最底层可能是满的。
来源https://en.wikipedia.org/wiki/Binary_heap:
二进制堆被定义为具有两个附加约束的二进制树:[3]
- Shape属性:二进制堆是一个完整的二进制树;也就是说,树的所有级别(可能除了最后一个(最深的((都被完全填充,如果树的最后一个级别不完整,则该级别的节点将从左到右填充
- 堆属性:根据某个总顺序,每个节点中存储的密钥要么大于或等于(≥(,要么小于或等于(≤(节点子节点中的密钥
关于您的问题:
1:父节点的优先级是否总是高于其任何子节点的优先级?
在最大堆中,父节点的优先级总是大于或等于其子节点的优先级。
2:左同级的优先级总是低于右同级的优先级吗?
绝对不是!以下两个都是有效的最大堆:
3 3
/ /
2 1 1 2
在维护Shape属性的同时,试图维护左子项和右子项的顺序是愚蠢的。这是可以做到的,但要付出巨大的效率代价。
关于问题3和4,请参阅上面对Shape属性的讨论。特别是。
3:每个级别都满了吗,除了可能是右加载的顶层?
否。
4:每个级别都满了吗,可能除了底部级别,它是左加载的。
是。Shape属性就是这么说的。
在了解堆之前,您应该了解完全二叉树(CBT(和几乎完全二叉树法(ACBT(的定义。
CBT和ACBT
完整二叉树:完整的二叉树是指除叶子以外的每个节点都有两个子节点的树。
几乎完全二叉树:在每个节点的给定二叉树中:
- 填充左子项后,只填充右子项
- 填充当前级别后,只填充下一级别
现在,让我们来看看二进制堆的定义:
二进制堆是一个完整的二进制树或几乎完全的二进制树(所有级别都已完全填充,除了最后一级可能有所有键尽可能剩余,即左加载(。此属性适用于将堆存储在数组中。
二进制堆的类型:
最大堆:在给定的ACBT或CBT中;父根与子根相比最大或相等。
最小堆:在给定的ACBT或CBT中;父节点在比较其子节点时最小或相等。
这个解释将澄清你所有的问题,但让我为你总结一下。
-
这里不考虑优先级。在这里,无论您遵循什么顺序(基于Max或Min堆(,都必须为每个节点遵循。您需要记住的唯一一点是,在最大堆父节点为最大或等于其子节点的情况下,在最小堆中反之亦然。你不在乎左孩子或右孩子。这在二进制搜索树(BST(中得到了注意
-
所有级别都是满的,除了最后一个级别可能有尽可能多的键(我指的是孩子(。
-
在二进制堆中,如果堆是一个具有N个节点的完整二进制树,则它具有最小的可能高度,即log2N。
有一个惊人的链接,您可以参考它来更好地了解堆。