二叉堆有两种:最小成员key排在队首的称为“最小堆(min heap)”;最大key排在队首的是“最大堆(max heap)”,这是一种优先队列的实现方式。
优先队列的出队(Dequeue)操作和队列一样,都是从队首出队。但在优先队列内部,数据项的次序是由它们的“优先级”来确定的:有最高优先级的数据项排在队首,而优先级最低的数据项则排在队尾。这样,优先队列的入队(Enqueue)操作就需要将数据项挤到队列前方。
完全二叉树:指每个内部节点都有两个子节点,最多可有一个节点例外。
如果完全树的节点在列表中的位置为p(p>0),那么其左子节点的位置就为2p,右子节点的位置就为2p+1。
找任意节点的父节点的方法:若节点在列表中的位置为n,那么其父节点的位置就是n//2。
堆次序:是指堆中任意一个节点x,其父节点p中的key(节点值)均小于或等于x中的key。
# 自定义最小堆类
class BinHeap(object):
# 构造二叉堆
def __init__(self):
# 表首下标为0的项并没有用到,但为了后面代码可以用到简单的整数乘除法,仍保留它
self.heapList = [0]
self.currentSize = 0
# 上浮函数,i为节点位置,判断新节点是否比父节点小,若小则新节点交换上浮以保证堆次序
def percUp(self, i):
while i // 2 > 0: #若父节点的位置大于0,则循环
if self.heapList[i] < self.heapList[i // 2]: #若子节点值小于父节点值&#