二叉堆
一,基本操作与准备知识:
- 子节点总是比父节点大
- 二叉堆的下标性质要求根节点下标必须为1,因此下标为零的项不用
二叉堆操作的实现:
1,二叉堆初始化:
#二叉堆的实现:
class Binheap:
def __init__(self):
self.heapList = [0]
self.currentSize = 0
2,二叉堆——insert(key)方法:
def percUp(self,i): #上浮方法上浮到不能再上浮
while i//2 > 0:
if self.heapList[i] < self.heapList[i//2]:
tmp = self.heapList[i//2]
self.heapList[i//2] = self.heapList[i]
self.heapList[i] = tmp
i = i//2
def insert(self,k): #插入方法
self.heapList.append(k)
self.currentSize = self.currentSize + 1
self.percUp(self.currentSize)
3,二叉堆——delMin()方法:
def percDown(self,i):#下沉方法——沉得不能再沉了
while (i*2) <= self.currentSize:
mc = self.minChild(i)
if self.heapList[i] > self.heapList[mc]:
tmp = self.heapList[i]
self.heapList[i] = self.heapList[mc]
self.heapList[mc] = tmp
i = mc
def minChild(self,i): #求出子结点中的较小项
if i*2+1 > self.currentSize:
return i*2
else:
if self.heapList[i*2] < self.heapList[i*2+1]:
return i*2
else:
return i*2+1
def delMin(self):
retval = self.heapList[1]
self.heapList[1] = self.heapList[self.currentSize]#将最新叶节点的值赋值给根节点
self.currentSize = self.currentSize - 1
self.heapList.pop()#将最后一项删除
self.percDown(1) #新顶下沉
return retval
4,二叉堆——buildHeap(lst)方法:
def buildHeap(self,alist):
i = len(alist)//2 #从最后节点的父节点开始下沉,因为叶节点无法下沉
self.currentSize = len(alist)
self.heapList = [0]+alist[:]
print(len(self.heapList),i)
while (i>0):
print(self.heapList,i)
self.percDown(i)
i = i-1
print(self.heapList,i)