1991번: 트리 순회
사용 언어: C
문제
이진 트리를 입력받아 전위 순회(preorder traversal), 중위 순회(inorder traversal), 후위 순회(postorder traversal)한 결과를 출력하는 프로그램을 작성하시오.
예를 들어 위와 같은 이진 트리가 입력되면,
- 전위 순회한 결과 : ABDCEFG // (루트) (왼쪽 자식) (오른쪽 자식)
- 중위 순회한 결과 : DBAECFG // (왼쪽 자식) (루트) (오른쪽 자식)
- 후위 순회한 결과 : DBEGFCA // (왼쪽 자식) (오른쪽 자식) (루트)
가 된다.
입력
첫째 줄에는 이진 트리의 노드의 개수 N(1 ≤ N ≤ 26)이 주어진다. 둘째 줄부터 N개의 줄에 걸쳐 각 노드와 그의 왼쪽 자식 노드, 오른쪽 자식 노드가 주어진다. 노드의 이름은 A부터 차례대로 알파벳 대문자로 매겨지며, 항상 A가 루트 노드가 된다. 자식 노드가 없는 경우에는 .으로 표현한다.
출력
첫째 줄에 전위 순회, 둘째 줄에 중위 순회, 셋째 줄에 후위 순회한 결과를 출력한다. 각 줄에 N개의 알파벳을 공백 없이 출력하면 된다.
풀이
저번 '10816번: 숫자 카드 2'에서 생각지도 못한 이진 탐색 트리로 푸신 본을 보고 나도 트리 문제를 풀고 싶어서 트리 쪽에서 간단한 기본 개념 문제를 풀었다. 물론 10816번은 이진 탐색 트리로 풀면 시간복잡도와 공간복잡도가 더 커서 비효율적이긴하다. 풀이는 최대한 직관적이게 써서 설명이 필요 없을 거라고 생각한다.
#include <stdio.h>
#include <stdlib.h>
//트리 노드 정의
typedef struct TreeNode{
char ele;
struct TreeNode *left;
struct TreeNode *right;
}TreeNode;
//새로운 노드 생성
TreeNode *New_TreeNode(char data)
{
TreeNode *New = (TreeNode*)malloc(sizeof(TreeNode));
New->ele = data;
New->left = NULL; New->right = NULL;
return New;
}
//트리 검색 함수
TreeNode *Search_TreeNode(TreeNode *TN, char data)
{
if(TN != NULL)
{
if(TN->ele == data)
return TN;
else
{
TreeNode *temp = Search_TreeNode(TN->left, data);
if(temp != NULL)
return temp;
return Search_TreeNode(TN->right, data);
}
}
return NULL;
}
//data1이 부모 노드, data2가 왼쪽 자식 노드, data3가 오른쪽 자식 노드
void Insert_TreeNode(TreeNode *TN, char data1, char data2, char data3)
{
TN->ele = data1;
if(data2 != '.')
TN->left = New_TreeNode(data2);
if(data3 != '.')
TN->right = New_TreeNode(data3);
}
//전위 순회
void Preorder_Traversal(TreeNode *TN)
{
if(TN == NULL)
return;
printf("%c",TN->ele);
Preorder_Traversal(TN->left);
Preorder_Traversal(TN->right);
}
//중위 순회
void Inorder_Traversal(TreeNode *TN)
{
if(TN == NULL)
return;
Inorder_Traversal(TN->left);
printf("%c",TN->ele);
Inorder_Traversal(TN->right);
}
//후위 순회
void Postorder_Traversal(TreeNode *TN)
{
if(TN == NULL)
return;
Postorder_Traversal(TN->left);
Postorder_Traversal(TN->right);
printf("%c",TN->ele);
}
int main(void)
{
int N;
TreeNode *Tree = New_TreeNode(NULL);
TreeNode *Temp_Node;
scanf("%d",&N);
getchar();
for(int i=0; i<N; i++)
{
char parent, left, right;
scanf("%c %c %c",&parent,&left,&right);
getchar();
Temp_Node = Search_TreeNode(Tree, parent);
if(Temp_Node == NULL)
Insert_TreeNode(Tree, parent, left ,right);
else
Insert_TreeNode(Temp_Node, parent, left, right);
}
Preorder_Traversal(Tree); printf("\n");
Inorder_Traversal(Tree); printf("\n");
Postorder_Traversal(Tree); printf("\n");
return 0;
}
'BOJ > 트리' 카테고리의 다른 글
6549번: 히스토그램에서 가장 큰 직사각형 (BOJ C/C++) (0) | 2022.02.24 |
---|---|
11279번: 최대 힙 (BOJ C/C++) (0) | 2022.02.18 |
1927번: 최소 힙 (BOJ C/C++) (0) | 2022.02.18 |