완전이진트리
- 왼쪽부터 차례로 빈 곳 없이 채워진 이진트리
- 인덱스 표시 가능
규칙
- 모든 노드의 부모 노드 인덱스 번호는 2로 나눈 몫
- 모든 노드의 왼쪽 자식은 본인 인덱스 2, 오른쪽 자식은 본인 인덱스 2 + 1

포화 이진트리
- 모든 트리 레벨에서 노드가 꽉 차 있는 이진트리
- 노드의 총 차수 : n일 때,

힙 자료구조
최소힙

- 완전이진트리 + 어떤 서브트리를 보더라도 부모 노드는 항상 자식 노드보다
작아야 한다.
최소힙 삽입
- 완전이진트리 유지 + 맨 끝에 넣음
- 최소힙 유지 ➡️ 조상 노드를 거슬러 올라가며 부모가 더 큰 경우 스왑
최소힙 삭제
- 루트노드 확보(최솟값) + 맨 뒤에서 잘라 올림
- 루트로 맨 뒤 값을 잘라 올린 후 최소힙 요건 만족하는지 확인
- 자식 노드의 숫자가 더 작으면 왼쪽 / 오른쪽 자식 중 작은 수를 택해 리프 노드가 될 때까지 스왑
heap = [0]
def heap_push(item):
heap.append(item)
child = len(heap) - 1
parent = child // 2
while parent > 0 and heap[parent] > heap[child]:
heap[parent], heap[child] = heap[child], heap[parent]
child = parent
parent = child // 2
def heap_pop():
if len(heap) == 1:
return 0
result = heap[1]
heap[1] = heap[-1]
heap.pop()
parent = 1
child = parent * 2
while child < len(heap):
if child + 1 < len(heap) and heap[child] > heap[child + 1]:
child += 1
if child >= len(heap) or heap[parent] <= heap[child]:
break
heap[parent], heap[child] = heap[child], heap[parent]
parent = child
child = parent * 2
return result
최대힙

- 완전이진트리 + 어떤 서브트리를 보더라도 부모 노드는 항상 자식 노드보다
커야한다.