// 각 노드는 최대 2개의 자식을 가진다 (0개, 1개, 2개)
// 왼쪽 자식은 작고, 오른쪽 자식은 크다
📌 예시 이미지 (BST 최소값/최대값 경로):
// 부모 노드는 항상 자식 노드보다 크거나 같다 (Max Heap 기준)
📌 완전 이진 트리 예시:
| 항목 | 힙 트리 (Heap) | 이진 검색 트리 (BST) |
|---|---|---|
| 정렬 규칙 | 부모 ≥ 자식 (Max) | 왼쪽 < 부모 < 오른쪽 |
| 트리 형태 | 완전 이진 트리 | 균형 X (편향될 수 있음) |
| 최댓값/최솟값 접근 | O(1) (루트) | O(logN) ~ O(N) |
| 삽입/삭제 | O(logN) | O(logN) (평균) |
| 구현 난이도 | 낮음 (배열 사용) | 높음 (트리 재조정 필요) |
// 배열로 표현
int left = (2 * i) + 1;
int right = (2 * i) + 2;
int parent = (i - 1) / 2;
void Push(int value) {
heap.push_back(value);
int child = heap.size() - 1;
while (child > 0) {
int parent = (child - 1) / 2;
if (heap[parent] >= heap[child])
break;
swap(heap[parent], heap[child]);
child = parent;
}
}
void Pop() {
swap(heap[0], heap.back());
heap.pop_back();
int parent = 0;
while (true) {
int left = (2 * parent) + 1;
int right = (2 * parent) + 2;
int largest = parent;
if (left < heap.size() && heap[left] > heap[largest])
largest = left;
if (right < heap.size() && heap[right] > heap[largest])
largest = right;
if (largest == parent)
break;
swap(heap[parent], heap[largest]);
parent = largest;
}
}