문제 링크: 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'));
        }
    }
}