ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준] 1991 트리 순회 - Java
    알고리즘 문제 풀이 2024. 5. 1. 16:49

    문제 - 트리 순회

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

     

     

    입력

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

     

    출력

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

     

     

    예제 입력

    7
    A B C
    B D .
    C E F
    E . .
    F . G
    D . .
    G . .

     

    예제 출력

    ABDCEFG
    DBAECFG
    DBEGFCA

    접근 방법

     

    - 이 문제는 자료 구조 트리에 대한 기본적인 문제이다

    - 트리의 전위, 중위, 후위 순회에 대한 개념이 있어야한다


    코드 작성

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.StringTokenizer;
    
    public class Main {
    
        public static void main(String[] args) throws IOException {
    
            try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
                int N = Integer.parseInt(br.readLine());
                Node[] tree = new Node[N + 1];
    
                for (int i = 0; i < N; i++) {
                    StringTokenizer st = new StringTokenizer(br.readLine());
    
                    char parentNode = st.nextToken().charAt(0);
                    char leftNode = st.nextToken().charAt(0);
                    char rightNode = st.nextToken().charAt(0);
    
                    if (tree[parentNode - 'A'] == null) {
                        tree[parentNode - 'A'] = new Node(parentNode);
                    }
    
                    if (leftNode != '.') {
                        tree[leftNode - 'A'] = new Node(leftNode);
                        tree[parentNode - 'A'].left = tree[leftNode - 'A'];
                    }
    
                    if (rightNode != '.') {
                        tree[rightNode - 'A'] = new Node(rightNode);
                        tree[parentNode - 'A'].right = tree[rightNode - 'A'];
                    }
                }
    
                preorder(tree[0]);
                System.out.println();
    
                inorder(tree[0]);
                System.out.println();
    
                postorder(tree[0]);
                System.out.println();
    
            }
        }
    
        public static void preorder(Node node) {
            if (node == null) {
                return;
            }
            System.out.print(node.value);
            preorder(node.left);
            preorder(node.right);
        }
    
        // 중위 순회
        public static void inorder(Node node) {
            if (node == null) {
                return;
            }
            inorder(node.left);
            System.out.print(node.value);
            inorder(node.right);
        }
    
        // 후위 순회
        public static void postorder(Node node) {
            if (node == null) {
                return;
            }
            postorder(node.left);
            postorder(node.right);
            System.out.print(node.value);
        }
    }
    
    class Node {
        char value;
        Node left;
        Node right;
    
        public Node(char value) {
            this.value = value;
            this.left = null;
            this.right = null;
        }
    }

    풀고 느낀점

     

    - 일단 이 문제로 인해 트리에 대해 알아보는 시간을 가져 본 것 같다

Designed by Tistory.