문제
https://www.acmicpc.net/problem/1991
1991번: 트리 순회
첫째 줄에는 이진 트리의 노드의 개수 N(1 ≤ N ≤ 26)이 주어진다. 둘째 줄부터 N개의 줄에 걸쳐 각 노드와 그의 왼쪽 자식 노드, 오른쪽 자식 노드가 주어진다. 노드의 이름은 A부터 차례대로 알파
www.acmicpc.net
주어진 트리를 전위, 중위, 후위 순회하는 문제였다.
문제 풀이
재귀함수를 이용해 해결했다.
#define _CRT_SECURE_NO_WARNINGS
#include <vector>
#include<iostream>
#include <queue>
#include <string>
#include <algorithm>
#include <stack>
#include <stdlib.h>
#include<stdio.h>
using namespace std;
pair<int, int> G[27];//최대 노드 수 26
int N;
int ischar(char a) {
if (a >= 'A' && a <= 'Z') return 1;
else return 0;
}
void printTree(){
for (int i = 0; i < N; i++) {
printf("%c %c %c\n", i + 'A', G[i].first + 'A', G[i].second + 'A');
}
printf("\n");
}
void printFrontTree(int index) {
if (index > N) return;
printf("%c", index + 'A');
if (G[index].first != -1) { //왼쪽
printFrontTree(G[index].first);
}
if (G[index].second != -1) {
printFrontTree(G[index].second);
}
}
void printMidTree(int index) {
if (index > N) return;
if (G[index].first != -1) { //왼쪽
printMidTree(G[index].first);
}
printf("%c", index + 'A');
if (G[index].second != -1) {
printMidTree(G[index].second);
}
}
void printBackTree(int index) {
if (index > N) return;
if (G[index].first != -1) { //왼쪽
printBackTree(G[index].first);
}
if (G[index].second != -1) {
printBackTree(G[index].second);
}
printf("%c", index + 'A');
}
int main() {
scanf("%d", &N);
int left, right;
getchar();
//입력
for (int i = 0; i < N; i++) {
char a, b, c;
scanf("%c %c %c", &a, &b, &c);
getchar();
left = right = -1; //아무것도 없으면 -1
if (ischar(b) == 1) { //왼쪽
left = b - 'A';
}
if (ischar(c) == 1) { //오른쪽
right = c - 'A';
}
G[a-'A'].first = left;
G[a-'A'].second = right;
}
//printTree();
printFrontTree(0);
printf("\n");
printMidTree(0);
printf("\n");
printBackTree(0);
}
/*
7
A B C
B D .
C E F
E . .
F . G
D . .
G . .
*/
문제
https://www.acmicpc.net/problem/1991
1991번: 트리 순회
첫째 줄에는 이진 트리의 노드의 개수 N(1 ≤ N ≤ 26)이 주어진다. 둘째 줄부터 N개의 줄에 걸쳐 각 노드와 그의 왼쪽 자식 노드, 오른쪽 자식 노드가 주어진다. 노드의 이름은 A부터 차례대로 알파
www.acmicpc.net
주어진 트리를 전위, 중위, 후위 순회하는 문제였다.
문제 풀이
재귀함수를 이용해 해결했다.
#define _CRT_SECURE_NO_WARNINGS #include <vector> #include<iostream> #include <queue> #include <string> #include <algorithm> #include <stack> #include <stdlib.h> #include<stdio.h> using namespace std; pair<int, int> G[27];//최대 노드 수 26 int N; int ischar(char a) { if (a >= 'A' && a <= 'Z') return 1; else return 0; } void printTree(){ for (int i = 0; i < N; i++) { printf("%c %c %c\n", i + 'A', G[i].first + 'A', G[i].second + 'A'); } printf("\n"); } void printFrontTree(int index) { if (index > N) return; printf("%c", index + 'A'); if (G[index].first != -1) { //왼쪽 printFrontTree(G[index].first); } if (G[index].second != -1) { printFrontTree(G[index].second); } } void printMidTree(int index) { if (index > N) return; if (G[index].first != -1) { //왼쪽 printMidTree(G[index].first); } printf("%c", index + 'A'); if (G[index].second != -1) { printMidTree(G[index].second); } } void printBackTree(int index) { if (index > N) return; if (G[index].first != -1) { //왼쪽 printBackTree(G[index].first); } if (G[index].second != -1) { printBackTree(G[index].second); } printf("%c", index + 'A'); } int main() { scanf("%d", &N); int left, right; getchar(); //입력 for (int i = 0; i < N; i++) { char a, b, c; scanf("%c %c %c", &a, &b, &c); getchar(); left = right = -1; //아무것도 없으면 -1 if (ischar(b) == 1) { //왼쪽 left = b - 'A'; } if (ischar(c) == 1) { //오른쪽 right = c - 'A'; } G[a-'A'].first = left; G[a-'A'].second = right; } //printTree(); printFrontTree(0); printf("\n"); printMidTree(0); printf("\n"); printBackTree(0); } /* 7 A B C B D . C E F E . . F . G D . . G . . */