Tree는 아래의 조건들을 만족하는 그래프입니다.
트리 구조는 그래프의 일종이므로 그래프와 같이 인접리스트 또는 인접행렬로 표현할 수 있습니다. 또한 자식노드가 최대 2개인 Binary tree의 경우 1차원 배열을 사용하여 간단하게 표현할 수 있습니다. 단, 이 방법으로 구현할 경우 Skewed binary tree(한쪽으로만 편향된 트리)의 경우 메모리 낭비가 심합니다. 이 방법뿐 아니라 노드의 부모노드만 저장하는 식으로 Uion-Find를 이용하여 구현할 수도 있습니다. 하지만 인접리스트를 사용하는 방법이 메모리도 효율적으로 사용할 수 있고 대부분의 상황에서 좋은 것 같습니다.
Traversal는 트리의 모든 노드를 방문하는 순서를 의미합니다. 현재 노드의 왼쪽 자식 노드를 방문하는 것을 'L', 현재 노드를 방문하는 것을 'D', 현재 노드의 오른쪽 자식 노드를 방문하는 것을 'R'이라고 가정하겠습니다. Traversal는 아래의 3가지로 나누어집니다.
#include <bits/stdc++.h>
using namespace std;
vector<int> vec[33];
void pre(int s) { // 전위 순회
if (s == -1)
return;
printf("%c", s + 'A');
pre(vec[s][0]);
pre(vec[s][1]);
}
void in(int s) { // 중위 순회
if (s == -1)
return;
in(vec[s][0]);
printf("%c", s + 'A');
in(vec[s][1]);
}
void post(int s) { // 후위 순회
if (s == -1)
return;
post(vec[s][0]);
post(vec[s][1]);
printf("%c", s + 'A');
}
int main() {
int n;
scanf_s("%d", &n);
for (int i = 0; i < n; i++) {
char msg[3];
for(int j=0; j<3; j++)
cin >> msg[j];
int p = msg[0] - 'A';
int l = -1;
int r = -1;
if (msg[1] != '.')
l = msg[1] - 'A';
if (msg[2] != '.')
r = msg[2] - 'A';
vec[p].push_back(l);
vec[p].push_back(r);
}
pre(0);
puts("");
in(0);
puts("");
post(0);
return 0;
}