이진트리의 한 종류(이진 힙-binary heap)
1. 루트(root)노드가 언제나 최댓값 또는 최솟값을 가진다.
최대 힙(max heap), 최소 힙(min heap)
재귀적으로도 정의됨 => 어느 노드를 루트로 하는 서브트리도 모두 최대 힙 , 느슨한 정렬 구조를 가지고 있다.
배열을 이용한 이진 트리의 표현
노드 번호 m을 기준으로
==> 왼쪽 자식의 번호 2 m
==> 오른쪽 자식의 번호 2 m + 1
==> 부모 노드의 번호 m // 2
====> 완전 이진트리이므로 노드의 추가/삭제는 마지막 노드에서만
class MaxHeap:
def __init(self):
self.data = [None]
원소의 개수가 n인 최대 힙에 새로운 원소 삽입
==> 부모 노드와의 대소 비교 최대 회수: log2n
최악 복잡도 O(logn)의 삽입연산
class MaxHeap:
def insert(self, item):
** 힌트 : python에서 두 변수의 값 바꾸기
a = 3; b = 5
a, b = b, a ==> 변수의 값을 한번에 서로 바꿀 수 있다.
def insert(sef, item):
self.data.append(item)
# 배열로 보았을 때 가장 마지막에 삽입하기때문에 len(self.data)를 사용할 수 있다.
index = len(self.data)
if index == 1
return
# 부모노드보다 삽입하려는 데이터의 크기가 클 동안 반복하도록 한다.
while self.data[index] > self.data[index//2] :
self.data[index], self.data[index//2] = self.data[index//2], self.data[index]
index = index//2
# 루트노드이면 종료한다.
if index == 1:
break