# 構建樹實現堆
class binheap:
def __init__(self):
self.heaplist = [0]
self.currentsize = 0
#插入新結點後必要時交換子節點和父節點的位置保持堆的性質
def percup(self, i):
while i//2 > 0:
if self.heaplist[i] < self.heaplist[i//2]:
temp = self.heaplist[i//2]
self.heaplist[i//2] = self.heaplist[i]
self.heaplist[i] = temp
i = i//2
# 插入節點
def insert(self, k):
self.currentsize += 1
self.percup(self.currentsize)
# 刪除堆頂元素後, 交換堆尾和空堆頂的位置並實現元素的下沉
def percdown(self, i):
while (i*2) <= self.currentsize:
mc = self.minchild(i)
if self.heaplist[i] > self.heaplist[mc]:
temp = self.heaplist[i]
self.heaplist[i] = self.heaplist[mc]
self.heaplist[mc] = temp
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
def buildheap(self, alist):
i = len(alist) // 2
self.currentsize = len(alist)
self.heaplist = [0] + alist[:]
while (i > 0):
self.percdown(i)
i = i - 1
return self.heaplist
h = binheap()
print(h.buildheap([9, 6, 5, 2, 3]))
堆中的路徑(構建小頂堆)
將一系列給定數字插入乙個初始為空的小頂堆h。隨後對任意給定的下標i,列印從h i 到根結點的路徑。每組測試第1行包含2個正整數n和m 1000 分別是插入元素的個數 以及需要列印的路徑條數。下一行給出區間 10000,10000 內的n個要被插入乙個初始為空的小頂堆的整數。最後一行給出m個下標。對輸...
二叉堆構建
二叉堆本質上一種完全二叉樹,分為 最小堆和最大堆,二叉堆的根結點叫做堆頂 最大堆 最大堆的任何乙個父節點的值都大於或等於他的左右節點的值,最大堆的堆頂是整個堆中最大元素 最小堆 最小堆的任何乙個父節點的值都小於或等於他的左右節點的值,最小堆的堆頂是這個堆中最小元素 二叉堆的幾種操作 1 插入節點 插...
堆的構建及堆排序(C )
首先給出堆的定義 這裡 n個元素的序列當且僅當滿足下列關係之一時,稱之為堆。情形1 情形2 其中i 1,2,n 2向下取整 這邊兩個定義是由序號從0開始取還是從1開始取決定的。說明一下定義的意思,因為堆是完全二叉樹 官方定義是 若設二叉樹的深度為h,除第 h 層外,其它各層 1 h 1 的結點數都達...