라이브러리는 도서관 아닌가요

백준(BOJ) 1991 트리 순회 java 본문

알고리즘 문제

백준(BOJ) 1991 트리 순회 java

veryhi 2022. 3. 15. 15:12

https://www.acmicpc.net/problem/1991

 

1991번: 트리 순회

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

www.acmicpc.net

 

 

* char로 받아 int와 char로 오가며 처리해야 하니 타입에 주의하자.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

class Node{
    char left, right;
    public Node(char left, char right){
        this.left = left;
        this.right = right;
    }
}

public class Main {

    public static List<Node>[] list;
    public static StringBuilder sb = new StringBuilder();

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int N = Integer.parseInt(br.readLine());
        list = new List[N+1];

        for(int i=1; i<=N; ++i){
            list[i] = new ArrayList<>();
        }

        StringTokenizer st;
        for(int i=1; i<=N; ++i){
            st = new StringTokenizer(br.readLine());

            int data = st.nextToken().charAt(0) - '@'; // 'A' - '@' == 'A' - 'A' + 1 == 1
            char l = st.nextToken().charAt(0);
            char r = st.nextToken().charAt(0);
            list[data].add(new Node(l, r));
        }

        preorder(1);
        sb.append("\n");
        inorder(1);
        sb.append("\n");
        postorder(1);
        sb.append("\n");
        System.out.println(sb);

    }

    static void preorder(int start){
        for(Node node: list[start]){
            char l = node.left;
            char r = node.right;

            sb.append((char)(start+'@'));
            if(l != '.') preorder(l-'@');
            if(r != '.') preorder(r-'@');
        }
    }

    static void inorder(int start) {
        for(Node node : list[start]) {
            char l = node.left;
            char r = node.right;

            if(l != '.') inorder(l-'@');
            sb.append((char)(start+'@'));
            if(r != '.') inorder(r-'@');
        }
    }

    static void postorder(int start) {
        for(Node node : list[start]) {
            char l = node.left;
            char r = node.right;

            if(l != '.') postorder(l-'@');
            if(r != '.') postorder(r-'@');
            sb.append((char)(start+'@'));
        }
    }

}
Comments