문제링크 : https://www.acmicpc.net/problem/1991
1991번: 트리 순회
첫째 줄에는 이진 트리의 노드의 개수 N(1 ≤ N ≤ 26)이 주어진다. 둘째 줄부터 N개의 줄에 걸쳐 각 노드와 그의 왼쪽 자식 노드, 오른쪽 자식 노드가 주어진다. 노드의 이름은 A부터 차례대로 알파
www.acmicpc.net
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define MAX 987654321
#define pii pair <int, int>
pair <char, char> tree[26];
void pre(char node) //전위
{
if(node == '.') return;
cout << node;
pre(tree[node-'A'].first);
pre(tree[node-'A'].second);
}
void in(char node) //중위
{
if(node == '.') return;
in(tree[node-'A'].first);
cout << node;
in(tree[node-'A'].second);
}
void post(char node) //후위
{
if(node == '.') return;
post(tree[node-'A'].first);
post(tree[node-'A'].second);
cout << node;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int N;
cin >> N;
while(N--)
{
char root, left, right;
cin >> root >> left >> right;
tree[root - 'A'].first = left; //부모 왼쪽
tree[root - 'A'].second = right; //부모 오른쪽
}
pre('A');
cout<<"\n";
in('A');
cout<<"\n";
post('A');
return 0;
}
각 부모 노드에 맞게 왼쪽 자식과 오른쪽 자식을 할당했다.
배열에 담는데 문자로 담을 수 없으니 root - 'A'를 통해서 정수로 변환하여 해당 칸에 자식들을 넣어준다.
그리고 전위, 중위, 후위에 맞춰서 출력과 재귀를 적절히 넣어주면 된다.
전위 -> root(출력), left, right
중위 -> left, root(출력), right
후위 -> left, right(출력), root
'백준 > 실버' 카테고리의 다른 글
[백준 18352번] 특정 거리의 도시 찾기 (C++) (0) | 2023.04.26 |
---|---|
[백준 15903번] 카드 합체 놀이 (C++) (0) | 2023.04.24 |
[백준 9465번] 스티커 (C++) (0) | 2023.04.18 |
[백준 1817번] 짐 챙기는 숍 (C++) (0) | 2023.04.16 |
[백준 10610번] 30 (C++) (0) | 2023.04.11 |