[Data Structure] 이진 트리 순회
2021. 12. 12. 15:41ㆍMajor`/자료구조
이진 트리 순회방법
- 루트 방문 : V
- 왼쪽 서브트리 방문 : L
- 오른쪽 서브트리 방문 : R
- 루트를 언제 방문하느냐에 따라 전위(1), 중위(2), 후위(3)로 구분
① 전위순회 (preorder traversal) : VLR
- 루트 노드 방문 (V)
- 왼쪽 서브트리 방문 (L)
- 오른쪽 서브트리 방문 (R)
void preorder(treenode* root) { // VLR 순
if (root!=NULL) {
printf("[%d] ", root->data);
preorder(root->left);
preorder(root->right);
}
}
② 중위순회 (inorder traversal) : LVR
- 왼쪽 서브트리 방문 (L)
- 루트 노드 방문 (V)
- 오른쪽 서브트리 방문 (R)
void inorder(treenode* root) { // LVR 순
if (root != NULL) {
inorder(root->left);
printf("[%d] ", root->data);
inorder(root->right);
}
}
③ 후위순회 (postorder traversal) : LRV
- 왼쪽 서브트리 방문 (L)
- 오른쪽 서브트리 방문 (R)
- 루트 노드 방문 (V)
void postorder(treenode* root) { // LRV 순
if (root != NULL) {
postorder(root->left);
postorder(root->right);
printf("[%d] ", root->data);
}
}
※ Example
#include <stdio.h>
#include <stdlib.h>
// 이진트리 순회 (전위, 중위, 후위)
typedef int element;
typedef struct treenode {
element data;
struct treenode* left;
struct treenode* right;
}treenode;
treenode n1 = { 8, NULL, NULL };
treenode n2 = { 39, NULL, NULL };
treenode n3 = { 85, NULL, NULL };
treenode n4 = { 2, NULL, NULL };
treenode n5 = { 15, &n1, &n2 };
treenode n6 = { 21, &n3, &n4 };
treenode n7 = { 30, &n5, &n6 };
treenode* root = &n7; // 트리의 루트 노드(n7)를 가리키는 root 포인터
// 30
// 15 21
// 8 39 85 2
// 전위순회 : 30 15 8 39 21 85 2
// 중위순회 : 8 15 39 30 85 21 2
// 후위순회 : 8 39 15 85 2 21 30
void preorder(treenode* root) { // VLR 순
if (root != NULL) {
printf("[%d] ", root->data);
preorder(root->left);
preorder(root->right);
}
}
void inorder(treenode* root) { // LVR 순
if (root != NULL) {
inorder(root->left);
printf("[%d] ", root->data);
inorder(root->right);
}
}
void postorder(treenode* root) { // LRV 순
if (root != NULL) {
postorder(root->left);
postorder(root->right);
printf("[%d] ", root->data);
}
}
int main(void) {
printf("전위 순회 >> ");
preorder(root);
printf("\n");
printf("중위 순회 >> ");
inorder(root);
printf("\n");
printf("후위 순회 >> ");
postorder(root);
printf("\n");
}