(二叉)堆基础
二叉堆是一个数组,它可以被看成一个近似的完全二叉树。树的节点始终从左向右填充,因此除了最底层外,该树是完全充满的。
二叉堆可分为最大堆和最小堆。最大堆满足某个节点的值必须大于或等于其子节点的值;最小堆则相反。
调整堆
调整堆意在维护最大堆或最小堆的性质。以最大堆为例,其节点的值都要满足小于或等于其父节点的值。因此,堆中的最大元素存放在根节点中,并且,在任一子树种,该子树所包含的所有节点的值都不大于该子树根节点的值。
调整堆的思路是对于节点 i,我们假设以其子节点为根节点的子树都是最大堆,但这时 i 节点的值可能小于其孩子,由此需要通过调整将其下降到正确的位置上去,在下降的过程中,根节点始终与子节点中较大的且大于它本身的节点交换。
如有一数组:[27, 17, 3, 16, 13, 10, 1, 5, 7, 12, 4, 8, 9, 0],如下图所示:以红色节点“3”为例,该节点明显不满足最大堆的要求,因此将其“下降”,先与其子节点”10“交换,再进一步与”9“交换,得到调整后的数组:[27, 17, 10, 16, 13, 9, 1, 5, 7, 12, 4, 8, 3, 0]。
下面是用 Python 编写的调整堆函数 max_heapify():
d
...
继续阅读
(40)