#Created By: Chen Da
#先实现一个二叉堆,基于完整二叉树
class Binary_heap(object):
def __init__(self):
self.heap_list = [0] #一个空的二叉堆以零作为第一个元素,方便后续的整除计算
self.curr_size = 0
#通过比较新添加的项与父项的大小,如果该项小于父项则交换,从而维持堆的结构属性
def swap_up(self,i):
while i // 2 > 0:
if self.heap_list[i] < self.heap_list[i // 2]:
tmp = self.heap_list[i]
self.heap_list[i] = self.heap_list[i//2]
self.heap_list[i//2] = tmp
i //= 2
def insert(self,i):
self.heap_list.append(i)
self.curr_size += 1
self.swap_up(self.curr_size)
#寻找当前节点的最小子节点
def find_min_child(self,i):
if i * 2 + 1 > self.curr_size:
return i * 2
else:
if self.heap_list[i * 2] < self.heap_list[i * 2 + 1]:
return i * 2
return i * 2 + 1
#交换节点与其子节点直到都满足正确的位置
def swap_down(self,i):
while (i * 2) <= self.curr_size:
min_child = self.find_min_child(i)
if self.heap_list[i] > self.heap_list[min_child]:
tmp = self.heap_list[i]
self.heap_list[i] = self.heap_list[min_child]
self.heap_list[min_child] = tmp
i = min_child
def del_min(self):
min_value = self.heap_list[1]
#将最后一项交换到首项
self.heap_list[1] = self.heap_list[self.curr_size]
self.curr_size -= 1
self.heap_list.pop()
#维持堆正确的结构属性
self.swap_down(1)
return min_value
#利用列表构建堆的方法
def build_heap(self,lyst):
i = len(lyst) // 2 #从树的中间开始
self.curr_size = len(lyst)
self.heap_list = [0] + lyst[:]
while i > 0:
self.swap_down(i)
i -= 1
def get_list(self):
return self.heap_list
def test_binary_heap():
bh = Binary_heap()
bh.build_heap([3,5,7,1,2,9,4,11,17])
print(bh.get_list())
assert bh.del_min() == 1
print(bh.get_list())
bh.insert(15)
print(bh.get_list())
if __name__ == "__main__":
test_binary_heap()