1991번: 트리 순회
풀이
- 입력이 알파벳 순서대로 주어진다.
- 재귀 함수를 잘 이용한다!(재귀 함수 안 쓰면 굉장히 귀찮아짐)
코드
#include <cstdio>
#include <iostream>
// hint: these alphabet inputs are inputed as increasing sequence
struct Node
{
int mValue;
int mNextLeft;
int mNextRight;
};
struct Node arr[26];
char root, left, right;
void PrintPreorder(int c);
void PrintInorder(int c);
void PrintPostorder(int c);
int main()
{
int N;
for (int i = 0; i < 26; ++i)
{
arr[i].mNextLeft = -1;
arr[i].mNextRight = -1;
}
std::cin >> N;
for (int j = 0; j < N; ++j)
{
std::cin >> root >> left >> right;
arr[root - 'A'].mValue = 1; // it means true;
if (left != '.')
arr[root - 'A'].mNextLeft = left - 'A';
if (right != '.')
arr[root - 'A'].mNextRight = right - 'A';
}
PrintPreorder(0);
putchar('\n');
PrintInorder(0);
putchar('\n');
PrintPostorder(0);
putchar('\n');
return 0;
}
void PrintPreorder(int c)
{
if (c < 0 || c > 25 || arr[c].mValue == 0)
return;
printf("%c", c + 'A');
PrintPreorder(arr[c].mNextLeft);
PrintPreorder(arr[c].mNextRight);
}
void PrintInorder(int c)
{
if (c < 0 || c > 25 || arr[c].mValue == 0)
return;
PrintInorder(arr[c].mNextLeft);
printf("%c", c + 'A');
PrintInorder(arr[c].mNextRight);
}
void PrintPostorder(int c)
{
if (c < 0 || c > 25 || arr[c].mValue == 0)
return;
PrintPostorder(arr[c].mNextLeft);
PrintPostorder(arr[c].mNextRight);
printf("%c", c + 'A');
}
느낀 것
- 재귀 함수를 잘 쓰자
- iostream의 std::cin 이유가 scanf("%c", root)에서 root의 값이 계속 이상하게 반환되서 쓴 것인데 왜 인지 지금도 이해되지 않는다.
댓글