Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 삼성역테
- 알고리즘
- BFS
- 코테 문제
- dfs
- 코테
- 포스코 AI교육
- 삼성역량테스트
- 포스코 ai 교육
- 컴퓨팅사고
- 코딩테스트
- 영상처리
- DP
- 딥러닝
- MCU 딥러닝
- sort
- 초소형머신러닝
- dfs문제
- 다이나믹프로그래밍
- tflite
- TensorFlow Lite
- DP문제
- 포스코 교육
- bfs문제
- 삼성코딩테스트
- tinyml
- 자료구조
- 그리디
- 임베디드 딥러닝
- 삼성코테
Archives
- Today
- Total
코딩뚠뚠
[백준문제풀이] 1991 트리 순회 본문
반응형
풀이일시 : 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;
}
반응형
'알고리즘 문제풀이 > 백준문제풀이' 카테고리의 다른 글
[백준문제풀이] 1167 트리의 지름 (0) | 2021.01.04 |
---|---|
[백준문제풀이] 11725 트리의 부모 찾기 (0) | 2021.01.04 |
[백준문제풀이] 2632 피자판매 (0) | 2021.01.04 |
[백준문제풀이] 7453 합이 0인 네 정수 (0) | 2021.01.04 |
[백준문제풀이] 1208 부분수열의 합 2 (0) | 2021.01.04 |