![[자료구조] 이진 트리 순회](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdSr2dw%2FbtrPgZ5Zghu%2F9Pv7xXjHurHUGAGPCKsJG0%2Fimg.png)

이진 트리 순회
이진 트리를 순회한다는 것은 이진 트리에 속하는 모든 노드를 한 번씩 방문하여 노드가 가지고 있는 데이터를 목적에 맞게 처리하는 것을 의미합니다. 이진 트리에서 순회가 중요한 이유는, 순회 순서에 따라 기대할 수 있는 결과값이 다르기 때문입니다.
이진 트리 순회 방법
전위, 중위, 후위 총 3가지의 방법이 있습니다. 이는 루트와 왼쪽 서브트리, 오른쪽 서브 트리 중에서 루트를 언제 방문하느냐에 따라 구분됩니다.
만약 루트를 방문하는 작업을 V라 하고, 왼쪽 서브트리 방문을 L, 오른쪽 서브트리 방문을 R이라고 한다면 다음과 같이 3가지 방법을 생각할 수 있습니다.
이진 트리의 순회방법
전위 순회(preorder traversal): VLR
중위 순회(inorder traversal): LVR
후위 순회(postorder traversal): LRV
각각의 서브트리들도 같은 방식으로 방문하게 됩니다. 전위 순회라면 서브트리에 들어 있는 노드들도 VLR의 순서대로 순회됩니다.
트리 순회 알고리즘은 순환 기법을 사용합니다. 이 방법으로 하지 않으면 트리를 순회하는 알고리즘을 만들 수 없습니다. 전체 트리나 서브 트리나 구조는 동일하고, 문제의 크기가 작아지므로 순환을 적용할 수 있는 것입니다.
전위 순회
방문 순서: 루트 → 왼쪽 → 오른쪽

중위 순회
방문 순서: 왼쪽 → 루트 → 오른쪽

후위 순회
방문 순서: 왼쪽 → 오른쪽 → 루트

전위, 중위, 후위 순회 구현
// 전위 순회
void preorder(TreeNode *root) {
if(root != NULL) {
printf("[%d]", root -> data); // 노드 방문
preorder(root -> left); // 왼쪽 서브트리 방문
preorder(root -> right); // 오른쪽 서브트리 방문
}
}
// 중위 순회
void inorder(TreeNode *root) {
if(root != NULL) {
inorder(root -> left); // 왼쪽 서브트리 방문
printf("[%d]", root -> data); // 노드 방문
inorder(root -> right); // 오른쪽 서브트리 방문
}
}
// 후위 순회
void postorder(TreeNode *root) {
if(root != NULL) {
postorder(root -> left); // 왼쪽 서브트리 방문
postorder(root -> right); // 오른쪽 서브트리 방문
printf("[%d]", root -> data); // 노드 방문
}
}
레벨 순회
각 노드들을 레벨 순으로 검사하는 순회 방법입니다. 이 순회는 큐를 사용합니다.
큐에 있는 노드를 꺼내어 방문한 다음, 그 노드의 자식들을 큐에 삽입하는 것을 노드가 없을 때까지 반복합니다.
void level_order(TreeNode *ptr) {
QueueType q;
init_queue(&q); // 큐 초기화
if(ptr == NULL) return;
enqueue(&q, ptr);
while(!is_empty(&q)) {
ptr = dequeue(&q);
printf(" [%d] ", ptr->data);
if(ptr->left) {
enqueue(&q, ptr->left);
}
if(ptr->right) {
enqueue(&q, ptr->right);
}
}
}
'CSE > 자료구조 (data structure)' 카테고리의 다른 글
[자료구조] 힙 (Heap) (0) | 2022.10.20 |
---|---|
[자료구조] 이진 탐색 트리 (BST; Binary Search Tree) (0) | 2022.10.19 |
[자료구조] 이진 트리 (Binary Tree) (0) | 2022.10.17 |
[자료구조] 트리 (Tree) (2) | 2022.10.16 |
[자료구조] 이중 연결 리스트 (Double Linked List) (0) | 2022.10.09 |
컴퓨터 전공 관련, 프론트엔드 개발 지식들을 공유합니다. React, Javascript를 다룰 줄 알며 요즘에는 Typescript에도 관심이 생겨 공부하고 있습니다. 서로 소통하면서 프로젝트 하는 것을 즐기며 많은 대외활동으로 개발 능력과 소프트 스킬을 다듬어나가고 있습니다.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!