코드 11-4
def pop(self):
if self.is_empty():
return None
rem_elem = self.arr[1] ➊
➋
temp = self.arr[self.heapsize] self.heapsize -= 1
cur_idx = 1 ➌
child = self.left(cur_idx) ➍
while child <= self.heapsize: ➎
➏
if child < self.heapsize and \ self.arr[self.left(cur_idx)].key < self.arr[self.right(cur_idx)].key: child = self.right(cur_idx)
➐
if temp.key >= self.arr[child].key: break
➑
self.arr[cur_idx] = self.arr[child] cur_idx = child
child = self.left(cur_idx)
self.arr[cur_idx] = temp
return rem_elem
➊ 삭제된 후 반환될 원소
➋ 맨 마지막에 위치한 원소를 받아 온 후 힙 사이즈를 줄이면 완전 이진 트리 특성을 유지할 수 있습니다.
➌ 루트에서 시작
➍ 루트의 왼쪽 자식
➎ child > heapsize면 arr[cur_idx]는 리프 노드입니다.
➏ 오른쪽 자식이 있고 오른쪽 자식의 키가 왼쪽 자식의 키보다 크면 child를 오른쪽 자식으로
➐ 최대 힙 특성을 만족하면 반복문을 나옵니다.
➑ 키가 큰 자식 원소를 부모로 이동시킵니다. cur_idx는 자식 원소로 이동합니다.