![[자료구조] Heap](https://image.inblog.dev?url=https%3A%2F%2Finblog.ai%2Fapi%2Fog%3Ftitle%3D%255B%25EC%259E%2590%25EB%25A3%258C%25EA%25B5%25AC%25EC%25A1%25B0%255D%2520Heap%26logoUrl%3Dhttps%253A%252F%252Finblog.ai%252Finblog_logo.png%26blogTitle%3D%25EB%25B0%25B1%25EC%2597%2594%25EB%2593%259C%25EB%25B8%2594%25EB%25A1%259C%25EA%25B7%25B8-dohyeong&w=2048&q=75)
힙 순서 속성를 만족하는 완전 이진 트리
”힙에서 가장 작은 데이터를 갖는 노드는 뿌리 노드이다”
힙의 삽입 연산

- 힙의 최고 깊이 가장 우측 노드에 새 노드를 추가 ( 이때 힙은 완전 이진 트리 유지)

2. 삽입한 노드와 부모 노드를 비교 - 삽입한 노드가 부모 노드보다 크면 종료 , 작다면 다음단계를 진행

- 삽입한 노드가 부모 노드보다 작다면 부모노드와 위치를 서로 바꿈 → 2단계를 다시 진행
힙의 최소값 삭제 연산
뿌리 노드를 삭제하는 것과 같음

뿌리 노드를 삭제한 후 힙 순서 속성을 유지해야 함 → 루트노드 삭제 한 후 뒤처리 과정

- 힙의 최고 깊이에 있던 노드를 루트 노드로 옮겨야 한다 ( 이때 힙 순서 속성이 파괴 , 이를 복원하는 과정 진행)

- 옮겨온 노드의 양쪽 자식을 비교하여 작은 쪽 자식과 위치를 교환 → 힙 순서 속성을 지키려면 부모 노드 양쪽 자식보다 작은 값을 가져야 하기 때문

- 옮겨온 노드가 더 이상의 자식이 없는 리프 노드로 되거나 양쪽 자식보다 작은 값을 갖는 경우 삭제 연산을 종료 , 그렇지 않다면 다시 2단계를 반복
힙의 구현
힙은 링크드 리스트보다 배열을 이용하는게 더 적합하다.
- 깊이 0의 노드는 배열의 0인덱스
- 깊이 1의 노드는 배열의 1~2인덱스
- 깊이 2의 노드는 배열의 3~6인덱스
- 깊이 n의 노드는 배열의 2^n-1 ~ 2^(n+1)-2 요소 인덱스에 저장된다
k번 인덱스에 위치한 노드의 양쪽 자식의 인덱스
- 왼쪽 자식 노드 : 2k+1
- 오른쪽 자식 노드 : 2k+2
- 부모 노드는 : 2k-1 / 2
Share article