1. 답) (1)풀이) 히프 트리의 노드를 삭제할 때 항상 루트 누드를 삭제한다. 루트 노드를 삭제할 때마다 단말 노드를 루트 노드로 옮기고(논리적으로) 히프 트리의 성질을 만족할 때까지 옮겨진 루트 노드와 자식 노드의 위치를 바꾼다.2. 답) (1)풀이) 히프 트리는 어떠한 경우든 간에 완전 이진 트리의 성질을 만족한다.(완전 이진 트리: 마지막 레벨을 제외하고 모든 레벨이 완전히 채워져 있으며, 마지막 레벨의 모든 노드는 왼쪽부터 오른쪽으로 정렬된 트리) 완전 이진 트리 형태이므로 자식 노드와 부모 노드 간의 비교, 이동 연산이 수월하다.3. 답) (2)풀이) 히프 트리의 하나의 노드를 삭제하거나 삽입하는 연산의 시간복잡도는 O(logn)이다. (n은 노드의 개수) 히프 트리는 완전 이진 트리의 성질을 만족하므로 이 시간복잡도를 트리의 높이에 대한 식으로 표현하면 O(h)로 표현할 수 있다. (n는 트리의 높이)즉 하나의 노드를 삽입하거나 삭제할 때 트리의 높이만큼 연산이 실행된다.4. 답) (1)풀이) 히프 정렬(최대 히프는 내림차순 정렬, 최소 히프는 오름차순 정렬)은 트리의 데이터에서 몇 개의 데이터만을 추출하고자 할 때 가장 효율적인 정렬 알고리즘이다.( 정렬의 시간복잡도: O(nlogn) )
1. 답) (4)풀이) 중위 순회는 모든 노드에 대해서 왼쪽 노드 -> 현재 노드 -> 오른쪽 노드 순서대로 순회한다.2. 답) (2)풀이) (2)번의 트리를 전위 순회할 경우 A -> B -> D -> C -> E -> G -> H -> F 순으로 순회한다. (모든 노드에 대해서 현재 노드 -> 왼쪽 노드 -> 오른쪽 노드)따라서 5번째로 탐색되는 노드는 ‘E’ 노드이다.3. 답) (4)풀이) 후위 순회는 모든 노드에 대해서 왼쪽 노드 -> 오른쪽 노드 -> 현재 노드 순서대로 순회한다. 따라서 답은 (4)번이다. (*후위 순회에서 루트 노드는 가장 마지막으로 탐색된다.)4. 답) (3)풀이) 단말 노드는 자식 노드가 없는 노드를 말한다. 자식 노드가 하나라도 있는 노드는 단말노드가 아니다. 따라서 (4)번 문제의 트리에서 단말 노드는 ‘D’, ‘G’, ‘H’, ‘F’ 총 4개다.5. 답) (1)풀이) 트리의 차수는 해당 트리의 모든 노드 중에서 가장 큰 차수를 가진 노드의 차수를 말한다. 노드 ‘B’는 자식 노드가 3개를 가지므로 차수가 3개이다. 이 트리에서 가장 큰 차수를 가지는 노드는 ‘B’이므로 트리의 차수는 ‘B’노드의 차수인 3이다.6. 답) (3)풀이) 문제에서 주어진 식은 가장 일반적으로 사용되는 중위 표기식이다. 중위 표기식을 전위표기식으로 바꿔야 하는데, 연산자의 우선순위대로 괄호로 묶어야 한다.Y = A*B + C/D -> Y = ((A*B) + (C/D))괄호로 묶은 후 연산자를 자신의 짝인 괄호 앞에 놓는다.-> Y = +(*(AB)/CD))괄호를 빼면 Y = +*AB/CD이므로 답은 (4)번이다.이를 트리로 표현해보자.이 트리를 전위 순회하면 전위 표기식, 중위 순회하면 중위 표기식, 후위 순회하면 후위 표기식을 나타낸다. 참고로 중위 표기식 <-> 후위 표기식은 스택을 활용해서 계산할 수 있다.
1. 답) (3)번*(ㄴ)에서 자료 c를 가져오려면 pop 연산을 3회 수행해야 한다.(pop을 1회 수행 시 a를, 2회 수행 시 b를, 3회 수행 시 c를, 4회 수행 시 d를 가져온다.)2. 답) (1)번풀이) 배열로 구현된 리스트에서 삽입, 삭제 작업을 할 때 특정 값을 찾는 것뿐만 아니라 오른쪽에 있는 요소들을 모두 한 칸씩 옮기는 작업(shift 작업)이 필요하다. (삽입 시에는 오른쪽 요소들을 오른쪽으로, 삭제 시에는 오른쪽 요소들을 왼쪽으로 shift 해야 한다.)이에 반해 연결리스트의 삽입, 삭제 작업은 보통 이전 노드와 후속 노드의 주소를 알면 삽입 또는 삭제 작업 후 따로 해야 하는 작업이 없다.
1. (2) 원형 연결 리스트*원형 연결 리스트는 마지막 노드의 포인터가 첫 번째 노드를 가리킨다.2. (1) 배열*n번째 요소를 찾는다는 것은 특정한 값을 탐색한다는 것이 아니다. 즉 특정 요소로 접근하겠다는 의미인데, 이를 가장 빠르게 할 수 있는 것은 당연히 배열이다. 배열은 인덱스를 통해 특정 요소로 가장 빠르게 접근할 수 있는 자료구조다. 한 번에 접근이 가능하므로 당연히 시간복잡도는 O(1)이다.3. (3) last->link == NULLlast라는 포인터가 마지막 노드를 가리킨다고 했다.last (*는 포인터) 단순 연결리스트의 마지막 노드의 링크(link) 필드는 항상 NULL을 가리킨다. 따라서 last->link==NULL의 수식은 참이다. (참고로 위의 last라는 포인터는 연결리스트의 노드만을 가리킬 수 있는 포인터다. 포인터는 주소 값을 저장한다.)4. (c) p=p->link;위 그림은 단순 연결리스트의 일반적인 형태다. 링크의 포인터가 다음 노드를 가리키므로 p=p->link를 통해서 다음 노드로 접근하는 것이 가장 일반적인 다음 노드로 접근하는 방식이다. (for, while 루프 등을 활용)
1. 답) (a) A, B, C, D, E*큐는 선입선출(First In First Out, FIFO) 구조2. 답) (b) 2 0 1 2 3(front) 4 5(rear) 6 7 *위 그림은 배열로 구현한 2번 문제의 원형 큐 상태, e는 큐의 요소, - 는 공백 상태3. 답) 40, 50 front ↓ rear front rear *원형 큐에서 포화 상태와 공백 상태를 구별하기 위해 배열의 인덱스 한자리는 비우는 것을 기억하자. (원형 큐의 유일한 단점)4. 답) (c)원형 큐가 공백 상태인지 확인하는 코드int is_empty(QueueType*q){return q->front == q->rear;}5. 답) (2) front는 3, rear는 60 1 2 3(f) 4 5(r) 6 7 8 9 ↓0 1 2 3(f) 4 5 6(r) 7 8 9=> 삽입할 때 rear(후단)에 변화가, 삭제할 때는 front(전단)에 변화가 일어난다. 6. front rear1. (a) A 추가 ↓- - - - e e - -- 10 20 30 40 50- - - - 40 50- - - - e e - - - -- - - - e e e - - -- B C - - front rear2. (b) D 추가 ↓ front rear3. 삭제 ↓ front rear7. 답) (a) O(1) *삽입 또는 삭제하는 과정에서 어떠한 반복문도 거치지 않는다. if 문으로 포화 or 공백 상태인지 확인하고 후단에 삽입 or 전단에서 삭제 연산을 수행한다. 8.int get_count(QueueType* q) {int count = 0;for(int i = q->front; i != q->rear; i = (i + 1) % MAZ_QUEUE_SIZE)count++;return count;