class Heap:
def __init__(self, is_min=True):
self.data = []
self.is_min = is_min
def compare(self, child, parent):
if self.is_min:
return child < parent
else:
return child > parent
def push(self, val):
self.data.append(val)
self._heapify_up(len(self.data) - 1)
def _heapify_up(self, index):
while index > 0:
parent = (index - 1) // 2
# compare child and parent to decide if swap needed
if self.compare(self.data[index], self.data[parent]):
self.data[index], self.data[parent] = self.data[parent], self.data[index]
index = parent
else:
break
def __str__(self):
return ' -> '.join(map(str, self.data)) + ' -> null'
# Driver code
values = [5, 3, 9, 1, 7]
min_heap = Heap(is_min=True)
max_heap = Heap(is_min=False)
for v in values:
min_heap.push(v)
max_heap.push(v)
print("Min Heap final:", min_heap)
print("Max Heap final:", max_heap)if self.compare(self.data[index], self.data[parent]):
compare child and parent to decide if swap needed to maintain heap property
self.data[index], self.data[parent] = self.data[parent], self.data[index]
swap child and parent to move smaller/larger element up
advance index to parent to continue heapify up
Min Heap final: 1 -> 3 -> 9 -> 5 -> 7 -> null
Max Heap final: 9 -> 7 -> 3 -> 1 -> 5 -> null