堆python python構建堆

2021-10-12 01:35:25 字數 1537 閱讀 9932

# 構建樹實現堆

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 的結點數都達...