자료 구조와 알고리즘

이진 힙을, 루트를 a[0]으로 하는 배열 a[0], a[1], a[2], …에 위쪽 단부터 차례로 왼쪽부터 채워 저장한다. a[4]의 자식과 부모로 올바른 것은?

  1. A자식은 a[9]와 a[10], 부모는 a[1]
  2. B자식은 a[8]과 a[9], 부모는 a[2]
  3. C자식은 a[9]와 a[10], 부모는 a[2]
정답과 해설 보기

정답: A. 자식은 a[9]와 a[10], 부모는 a[1]

루트를 a[0]으로 하는 경우, a[i]의 자식은 a[2i+1]과 a[2i+2], 부모는 a[(i−1)÷2의 버림]입니다. i = 4이면 자식은 a[9]와 a[10], 부모는 a[(4−1)÷2] = a[1]입니다. 루트를 a[1]로 하는 경우는 자식이 a[2i]와 a[2i+1], 부모가 a[i÷2]가 되므로, 어느 방식인지 확인하는 것이 중요합니다. 이처럼 힙은 완전 이진 트리이므로 포인터를 쓰지 않고 배열로 나타낼 수 있으며, 첨자 계산만으로 부모와 자식을 따라갈 수 있습니다.

이 분야 연습하기 분야로 돌아가기

자료 구조와 알고리즘의 다른 문제

  1. 부모의 값이 자식의 값 이상이 되는 최대 힙을, 루트를 a[0]으로 하는 배열로 나타내고 있다. 힙 50, 30, 40, 10, 20, 35에 45를 추가한다. 맨 끝에 놓은 뒤 부모보다 큰 동안은 부모와 교환하는 조작을 수행한 후의 배열은?
  2. 이진 탐색 트리를 중위 순회(왼쪽 서브트리, 그 노드, 오른쪽 서브트리 순으로 방문한다)로 따라갔을 때, 방문한 노드의 값은 어떻게 늘어서는가? 값은 모두 서로 다르다고 한다.
  3. 빈 이진 탐색 트리에 50, 30, 70, 20, 40, 60, 80의 순서로 값을 삽입했다. 이 트리를 후위 순회(왼쪽 서브트리, 오른쪽 서브트리, 그 노드 순으로 방문한다)로 따라갔을 때의 순서는?
  4. 빈 이진 탐색 트리에 1, 2, 3, …, 1000의 순서로 값을 삽입했다(균형을 잡는 조작은 하지 않는다). 이 트리에서 1000을 찾을 때, 루트부터 비교하기 시작하여 찾을 때까지 비교하는 노드의 수는?
  5. 데이터베이스나 파일 시스템의 인덱스에 이진 탐색 트리가 아니라 B 트리(B+ 트리 포함)가 자주 쓰이는 주된 이유는?