트리 - 레벨 순회 알고리즘

2022. 2. 3. 16:21·자료구조
728x90
반응형

# [C언어로 쉽게 풀어쓴 자료구조(천인국)]를 공부하고 주요 내용을 정리하고자 작성하는 글입니다.

# 해당 게시글에 대한 모든 피드백 환영합니다.

 

이전 글: 트리 - 반복적 순회(스택으로 이해하기)

 

레벨 순회 level order

각 노드를 레벨 순으로 검사하는 순회 방법이다.

루트 노드의 레벨이 1이고, 아래로 내려갈수록 레벨은 증가한다.

동일한 레벨의 경우에는 좌->우로 방문한다.

 

레벨 순회에 적합한 자료구조는 큐 Queue 이다.

큐를 이용해서 레벨 순회를 진행하면 다음과 같다.

트리의 루트 노드를 우선 삽입한다. 그 다음부터는 큐가 공백 상태가 될 때까지 아래의 과정을 반복한다.
큐에서 dequeue를 한 다음, 삭제된 노드의 왼쪽 서브트리의 루트노드와 오른쪽 서브트리의 루트노드를 순서대로 큐에 enqueue한다. (NULL이 아니라는 가정 하에)

알고리즘은 아래와 같다. 

// Pseudo Code
level_order(root):
	if(root == NULL) return
	enqueue(queue, root)
	while (not queue.isEmpty)
		x <- dequeue(queue)
		print x<-data
		if( x->left != NULL) then
			enqueue(queue, x->left)
		if( x->right != NULL) then
			enqueue(queue, x->right)

이를 이용해 레벨 순회 프로그램을 구현해보면 다음과 같다.

#include <stdio.h>
#include <stdlib.h>

typedef struct {
	int data;
	struct TreeNode* left, * right;
} TreeNode;

//-------------원형 큐 코드 시작-------------
#define MAX_QUEUE_SIZE 20

typedef TreeNode* element;
typedef struct {
	element data[MAX_QUEUE_SIZE];
	int front, rear;
} QueueType;

// Error Check
void error(char* message) {
	fprintf(stderr, "%s\n", message);
	exit(1);
}
// init queue
void init_queue(QueueType* q) {
	q->front = q->rear = 0;
}
// check empty
int is_empty(QueueType* q) {
	return (q->front == q->rear);
}
// check full
int is_full(QueueType* q) {
	return (q->front == ((q->rear + 1) % MAX_QUEUE_SIZE));
}
// enqueue
void enqueue(QueueType* q, element item) {
	if (is_full(q)) {
		error("queue is full\n");
	}
	q->rear = (q->rear + 1) % MAX_QUEUE_SIZE;
	q->data[q->rear] = item;
}
// dequeue
element dequeue(QueueType* q) {
	if (is_empty(q)) {
		error("queue is empty\n");
	}
	q->front = (q->front + 1) % MAX_QUEUE_SIZE;
	return q->data[q->front];
}
// level traversal
void level_order(TreeNode *node) {
	QueueType q;
	init_queue(&q);
	if (node == NULL) return;
	enqueue(&q, node);
	while (!is_empty(&q)) {
		node = dequeue(&q);
		printf("%c -> ", node->data);
		if (node->left)
			enqueue(&q, node->left);
		if (node->right)
			enqueue(&q, node->right);
	}
}
TreeNode n0 = { 'D', NULL, NULL };
TreeNode n1 = { 'E', NULL, NULL };
TreeNode n2 = { 'B', &n0, &n1 };
TreeNode n3 = { 'F', NULL, NULL };
TreeNode n4 = { 'C', &n3, NULL };
TreeNode n5 = { 'A', &n2, &n4 };
TreeNode* root = &n5;

int main()
{
	printf("레벨 순회\n");
	level_order(root);
	printf("\n");
	return  0;
}

결과

728x90
반응형
저작자표시 비영리 변경금지 (새창열림)

'자료구조' 카테고리의 다른 글

트리 - 이진 트리의 노드 개수/ 단말 노드 개수/ 높이 구하기  (3) 2022.02.05
트리 - 수식 트리(후위 표기 수식)  (0) 2022.02.05
트리 - 반복적 순회(전위/중위/후위 순회 스택으로 이해하기)  (1) 2022.02.03
트리 - 이진트리 순회  (2) 2022.02.02
트리 - 이진트리 정의/ 성질/ 분류/ 표현법  (1) 2022.02.02
'자료구조' 카테고리의 다른 글
  • 트리 - 이진 트리의 노드 개수/ 단말 노드 개수/ 높이 구하기
  • 트리 - 수식 트리(후위 표기 수식)
  • 트리 - 반복적 순회(전위/중위/후위 순회 스택으로 이해하기)
  • 트리 - 이진트리 순회
heeya16
heeya16
개발 공부 냠냠
  • heeya16
    개발자 희야
    heeya16
  • 전체
    오늘
    어제
    • 분류 전체보기 (106)
      • 코딩테스트 (66)
        • 프로그래머스 (38)
        • SWEA (2)
        • BAEKJOON (26)
      • 알고리즘 (7)
      • 자료구조 (19)
      • 프로젝트 (5)
      • 취업 주르륵 (3)
      • 데이터베이스 (0)
      • IT지식 (2)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    1003
    10448
    10773
    10월
    10진수
    11047
    11399
    11403
    11866
    1449
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
heeya16
트리 - 레벨 순회 알고리즘
상단으로

티스토리툴바