본문 바로가기
온라인저지

[BOJ] 1991번: 트리 순회

by plzfday 2018. 5. 11.

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의 값이 계속 이상하게 반환되서 쓴 것인데 왜 인지 지금도 이해되지 않는다.

'온라인저지' 카테고리의 다른 글

[BOJ] 2448번: 별찍기 - 11  (0) 2018.05.15
[BOJ] 2523번: 별찍기 - 13  (0) 2018.05.15
[BOJ] 2447번: 별찍기 - 10  (0) 2018.05.15
[BOJ] 1009번: 분산처리  (0) 2018.05.05
[BOJ] 4673번: 셀프 넘버  (0) 2018.04.24
[BOJ] 14867번: 물통  (0) 2018.04.09

댓글