본문 바로가기
알고리즘/백준

[BOJ 백준] 1991 - 트리 순회, Java(자바)

by eungineer 2023. 3. 4.

문제

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

 

1991번: 트리 순회

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

www.acmicpc.net

풀이

알파벳 순서대로 노드의 이름이 매겨지므로 노드의 개수 N 크기의 Node 배열을 만들고, A 노드부터 인덱스 순서대로 Node를 생성한다. 입력에 따라 왼쪽, 오른쪽 자식 노드를 연결하고 전위, 중위, 후위 순회한 결과를 각각 출력한다. order 함수 하나만으로 전위, 중위, 후위 순회 결과를 한 번에 호출할 수도 있다.

코드

import java.util.*;
import java.io.*;

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

public class Main {
    static StringBuffer br, br_pre, br_in, br_post;
    public static void main(String args[]) throws Exception {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(in.readLine());
        Node[] arr = new Node[N];
        for (int i = 0; i < N; i++)
            arr[i] = new Node((char)('A' + i));
        for (int i = 0; i < N; i++) {
            String str = in.readLine();
            arr[str.charAt(0) - 'A'].left = str.charAt(2) == '.' ? null : arr[str.charAt(2) - 'A'];
            arr[str.charAt(0) - 'A'].right = str.charAt(4) == '.' ? null : arr[str.charAt(4) - 'A'];
        }
        
        br = new StringBuffer();
        preOrder(arr[0]);
        br.append("\n");
        inOrder(arr[0]);
        br.append("\n");
        postOrder(arr[0]);
        br.append("\n");
        System.out.println(br);
        
        // br_pre = new StringBuffer();
        // br_in = new StringBuffer();
        // br_post = new StringBuffer();
        // order(arr[0]);
        // System.out.println(br_pre + "\n" + br_in + "\n" + br_post);
    }
    
    // static void order(Node node) {
    //     br_pre.append(node.value);
    //     if (node.left != null)  order(node.left);
    //     br_in.append(node.value);
    //     if (node.right != null) order(node.right);
    //     br_post.append(node.value);
    // }
    
    static void preOrder(Node node) {
        br.append(node.value);
        if (node.left != null)  preOrder(node.left);
        if (node.right != null) preOrder(node.right);
    }
    
    static void inOrder(Node node) {
        if (node.left != null)  inOrder(node.left);
        br.append(node.value);
        if (node.right != null) inOrder(node.right);
    }
    
    static void postOrder(Node node) {
        if (node.left != null)  postOrder(node.left);
        if (node.right != null) postOrder(node.right);
        br.append(node.value);
    }
}