문제 링크


🔷 분류

트리, 재귀

✒️ 문제 설명

이진 트리를 입력받아 전위 순회(preorder traversal), 중위 순회(inorder traversal), 후위 순회(postorder traversal)한 결과를 출력하는 프로그램을 작성하시오.

trtr

예를 들어 위와 같은 이진 트리가 입력되면,

  • 전위 순회한 결과 : ABDCEFG // (루트) (왼쪽 자식) (오른쪽 자식)
  • 중위 순회한 결과 : DBAECFG // (왼쪽 자식) (루트) (오른쪽 자식)
  • 후위 순회한 결과 : DBEGFCA // (왼쪽 자식) (오른쪽 자식) (루트)

가 된다.

⬅️ 입력

첫째 줄에는 이진 트리의 노드의 개수 N(1 ≤ N ≤ 26)이 주어진다. 둘째 줄부터 N개의 줄에 걸쳐 각 노드와 그의 왼쪽 자식 노드, 오른쪽 자식 노드가 주어진다. 노드의 이름은 A부터 차례대로 알파벳 대문자로 매겨지며, 항상 A가 루트 노드가 된다. 자식 노드가 없는 경우에는 .으로 표현한다.

➡️ 출력

첫째 줄에 전위 순회, 둘째 줄에 중위 순회, 셋째 줄에 후위 순회한 결과를 출력한다. 각 줄에 N개의 알파벳을 공백 없이 출력하면 된다.

💻 코드 (C++)

#include <iostream>
#include <vector>
using namespace std;

struct Node {
  char data;
  char left;
  char right;
};

vector<Node> t(26); 

void pre_order(char cur) {
  if (cur == '.') return;
  cout << cur;
  pre_order(t[cur - 'A'].left);
  pre_order(t[cur - 'A'].right);
}

void in_order(char cur) {
  if (cur == '.') return;
  in_order(t[cur - 'A'].left);
  cout << cur;
  in_order(t[cur - 'A'].right);
}

void post_order(char cur) {
  if (cur == '.') return;
  post_order(t[cur - 'A'].left);
  post_order(t[cur - 'A'].right);
  cout << cur;
}

int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  int n;
  cin >> n;
  for (int i = 0; i < n; i++) {
    char p, l, r;
    cin >> p >> l >> r;
    t[p - 'A'] = {p, l, r};
  }

  pre_order('A');
  cout << "\n";
  in_order('A');
  cout << "\n";
  post_order('A');
  cout << "\n";
  return 0;
}

글 이동

Comments