我正在创建MaxHeap类,并且必须使用列表来完成。我无法按照满足maxheap要求的正确顺序将元素插入堆中。我不允许向构造函数添加任何内容。我该怎么办?
class MaxHeap:
def __init__(self):
self.Heap=[]
def parent(self, pos):
return pos//2
def leftChild(self, pos):
return 2 * pos
def rightChild(self, pos):
return (2 * pos) + 1
def insert(self, element):
self.Heap.append(element)
child = len(self.Heap) - 1
while child > 0:
parent = self.parent(child)
if self.Heap[parent] >= self.Heap[child]:
return
self.Heap[child], self.Heap[parent] = self.Heap[parent], self.Heap[child]
child = parent
x = MaxHeap()
x.insert(10)
x.insert(5)
x.insert(14)
x.insert(9)
x.insert(2)
x.insert(11)
x.insert(6)
插入14时,它最初是10的右子级。然后交换14和10,堆的层遍历是数组表示形式,14是父级,5是左子级,10是右子级,依此类推
当我最初添加14时,它从[10,5]变为[10,5,14]
使用[10,5,14],将14与它的父级(即10)进行比较。这不满足max heap属性,因此我必须将10与14切换,以使其变为[14,5]。 ,10]
我该怎么办?
答案 0 :(得分:2)
Python列表的索引从0开始,但是您使用的父/子公式是针对以1为根的堆。
对于以0为根的堆:
leftChild(x) = x*2+1
rightChild(x) = x*2+2
parent(x) = (x-1)//2