알고리즘/그래프

백준 - 1991

hahihi 2023. 10. 19. 22:28

문제

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 . .
*/