1991번: 트리 순회
첫째 줄에는 이진 트리의 노드의 개수 N(1≤N≤26)이 주어진다. 둘째 줄부터 N개의 줄에 걸쳐 각 노드와 그의 왼쪽 자식 노드, 오른쪽 자식 노드가 주어진다. 노드의 이름은 A부터 차례대로 영문자
www.acmicpc.net
트리의 자료구조를 잘 만드는 것이 중요한데 N * 3 의 배열로 구성한다.
각 노드별 row 를 의미하고 각 row 별로 첫번째가 부모 , 두번째가 왼쪽자식, 세번째가 오른쪽 자식을 나타내게 표현한다. 불필요한 연산을 하지 않기 위해 배열크기(N) 을 'Z' + 1 이 되게 하여 알파벳 char 로 바로 해당 위치의노드를 참조할수 있도록 구성한다.
각 순회는 재귀 호출을 통해 구현할 수 있다.
구현된 코드는 아래와 같다.
#include <iostream>
#include <vector>
using namespace std;
void traversePrefix(const char node, const vector<vector<int>> &tree)
{
cout << node;
if (tree[node][1] != '.')
traversePrefix(tree[node][1], tree);
if (tree[node][2] != '.')
traversePrefix(tree[node][2], tree);
}
void traversePostfix(const char node, const vector<vector<int>> &tree)
{
if (tree[node][1] != '.')
traversePostfix(tree[node][1], tree);
if (tree[node][2] != '.')
traversePostfix(tree[node][2], tree);
cout << node;
}
void traverseInfix(const char node, const vector<vector<int>> &tree)
{
if (tree[node][1] != '.')
traverseInfix(tree[node][1], tree);
cout << node;
if (tree[node][2] != '.')
traverseInfix(tree[node][2], tree);
}
int main()
{
int nrNode;
cin >> nrNode;
vector<vector<int>> tree('Z' + 1, vector<int>(3, 0));
for (unsigned int i = 0; i < tree.size(); i++)
tree[i][0] = i;
for (int i = 0; i < nrNode; i++)
{
char node, left, right;
cin >> node >> left >> right;
tree[node][1] = left;
tree[node][2] = right;
if (left != '.')
tree[left][0] = node;
if (right != '.')
tree[right][0] = node;
}
char root = 'A';
while (root != tree[root][0])
{
root = tree[root][0];
}
traversePrefix(root, tree);
cout << endl;
traverseInfix(root, tree);
cout << endl;
traversePostfix(root, tree);
cout << endl;
return 0;
}
'알고리즘' 카테고리의 다른 글
백준 2529 부등호 (0) | 2021.03.23 |
---|---|
백준 11725 - 트리의 부모찾기 (0) | 2020.09.13 |
백준 - 2606 바이러스 (0) | 2020.09.13 |
백준 - 1697 숨바꼭질 (0) | 2020.09.13 |
백준 - 2667 단지 번호 붙이기 (0) | 2020.09.12 |