문제 링크: https://www.acmicpc.net/problem/1991

 

1991번: 트리 순회

첫째 줄에는 이진 트리의 노드의 개수 N(1 ≤ N ≤ 26)이 주어진다. 둘째 줄부터 N개의 줄에 걸쳐 각 노드와 그의 왼쪽 자식 노드, 오른쪽 자식 노드가 주어진다. 노드의 이름은 A부터 차례대로 알파

www.acmicpc.net

 

트리의 전위, 중위, 후위 탐사를 진행하는 기초 문제다. 

 

List<Node>[] 의 배열 형태로 받아 저장한 후 루트부터 탐색을 진행하면 된다.

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
class Node{
char left;
char right;
public Node( char left, char right) {
this.left = left;
this.right = right;
}
}
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static int n;
static List<Node> []list;
static StringBuilder sb= new StringBuilder();
public static void main(String args[]) throws IOException {
n= Integer.parseInt(br.readLine());
list= new ArrayList[n];
for(int i=0; i<n; i++){
list[i]=new ArrayList<>();
}
for(int i=0; i<n; i++){
String[] s = br.readLine().split(" ");
char start = s[0].charAt(0);
char left = s[1].charAt(0);
char right = s[2].charAt(0);
list[start-'A'].add(new Node(left,right));
}
pre(0);
sb.append("\n");
mid(0);
sb.append("\n");
post(0);
System.out.println(sb.toString());
}
public static void pre(int start){
for(Node node : list[start]){
char left = node.left;
char right = node.right;
sb.append((char)(start+'A'));
if(left!='.'){
pre(left-'A');
}
if(right!='.'){
pre(right-'A');
}
}
}
public static void mid(int start){
for(Node node: list[start]){
char left = node.left;
char right = node.right;
if(left!='.'){
mid(left-'A');
}
sb.append((char)(start+'A'));
if(right!='.'){
mid(right-'A');
}
}
}
public static void post(int start){
for(Node node: list[start]){
char left = node.left;
char right = node.right;
if(left!='.'){
post(left-'A');
}
if(right!='.'){
post(right-'A');
}
sb.append((char)(start+'A'));
}
}
}