코딩뚠뚠

[백준문제풀이] 1991 트리 순회 본문

알고리즘 문제풀이/백준문제풀이

[백준문제풀이] 1991 트리 순회

로디네로 2021. 1. 4. 01:07
반응형

 

풀이일시 : 2020-12-27

 

 

문제 : 

이진 트리를 입력받아 전위 순회(preorder traversal), 중위 순회(inorder traversal), 후위 순회(postorder traversal)한 결과를 출력하는 프로그램을 작성하시오.

예를 들어 위와 같은 이진 트리가 입력되면,

  • 전위 순회한 결과 : ABDCEFG // (루트) (왼쪽 자식) (오른쪽 자식)
  • 중위 순회한 결과 : DBAECFG // (왼쪽 자식) (루트) (오른쪽 자식)
  • 후위 순회한 결과 : DBEGFCA // (왼쪽 자식) (오른쪽 자식) (루트)

가 된다.

 

 

입력 : 

첫째 줄에는 이진 트리의 노드의 개수 N(1≤N≤26)이 주어진다. 둘째 줄부터 N개의 줄에 걸쳐 각 노드와 그의 왼쪽 자식 노드, 오른쪽 자식 노드가 주어진다. 노드의 이름은 A부터 차례대로 영문자 대문자로 매겨지며, 항상 A가 루트 노드가 된다. 자식 노드가 없는 경우에는 .으로 표현된다.

 

 

출력 : 

첫째 줄에 전위 순회, 둘째 줄에 중위 순회, 셋째 줄에 후위 순회한 결과를 출력한다. 각 줄에 N개의 알파벳을 공백 없이 출력하면 된다.

 

 

풀이 : 

전위순회는 V / left / right

중위순회는 left / V / right

후위순회는 left / right / V

의 형태로 나타낼 수 있다.

 

입력시에 이진트리를 구성해주고 재귀를 통해 순회를 출력해준다.

 

//전위순회 중위순회 후위순회 구현

#include <iostream>
#include <vector>
using namespace std;

int N;
const int MAX = 26;
vector <pair<int,int>> v[MAX];

void preorder(int node) {
	cout << (char)(node + 'A');
	for (int i = 0; i < v[node].size(); i++) {
		preorder(v[node][i].first);
	}
}

void inorder(int node) {
	if (v[node].size() && v[node][0].second)
		inorder(v[node][0].first);
	cout << (char)(node + 'A');
	if (v[node].size() && !v[node][0].second)
		inorder(v[node][0].first);
	else if (v[node].size() == 2) {
		inorder(v[node][1].first);
	}
}

void postorder(int node)
{
	for (int i = 0; i < v[node].size(); i++)
		postorder(v[node][i].first);
	cout << (char)(node + 'A');
}

int main() {
	char a, b, c;
	cin >> N; //이진트리의 노드의 개수
	for (int i = 0; i < N; i++) {
		cin >> a >> b >> c;
		if (b != '.')
			v[a - 'A'].push_back({ b - 'A', 1 });
		if(c!='.')
			v[a - 'A'].push_back({ c - 'A', 0 });
	}
	preorder(0);
	cout << endl;
	inorder(0);
	cout << endl;
	postorder(0);
	cout << endl;
	return 0;
}
반응형