[Baekjoon] 1991번: 트리 순회

2023. 5. 12. 00:07Computer Sciences/Problem Solve

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

 

1991번: 트리 순회

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

www.acmicpc.net

문제 설명

주어진 이진 트리를 전위, 중위, 후위 순회한 결과를 출력하면 된다. 별다르게 어려울 건 없다. 이진 트리와 순회 방식만 알면 쉽게 풀 수 있다.

 

이진 트리의 순회는 다음 방식과 같다.

  • 전위 순회한 결과 : ABDCEFG // (루트) (왼쪽 자식) (오른쪽 자식)
  • 중위 순회한 결과 : DBAECFG // (왼쪽 자식) (루트) (오른쪽 자식)
  • 후위 순회한 결과 : DBEGFCA // (왼쪽 자식) (오른쪽 자식) (루트)

풀이 방법

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

class Main {
    
    static class Node {
        char name;
        Node left;
        Node right;
        
        public Node(char name) {
            this.name = name;
        }
    }
    
    static Node[] tree;
    
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        int N = Integer.parseInt(br.readLine());
        tree = new Node[N];
        
        for (int i = 0; i < N; i++) {
            tree[i] = new Node((char)('A' + i));
        }
        
        for (int i = 0; i < N; i++) {
            char[] chars = br.readLine().toCharArray();
            char parent = chars[0];
            char left = chars[2];
            char right = chars[4];
            
            if (left != '.') {
                tree[parent - 'A'].left = tree[left - 'A'];
            }
            
            if (right != '.') {
                tree[parent - 'A'].right = tree[right - 'A'];
            }
        }
        
        traversalPreorder(tree[0]);
        System.out.println();
        
        traversalInorder(tree[0]);
        System.out.println();
        
        traversalPostorder(tree[0]);
        System.out.println();
    }
    
    private static void traversalPreorder(Node node) {
        if (node != null) {
            System.out.print(node.name);   
            traversalPreorder(node.left);
            traversalPreorder(node.right);    
        }
    }
    
    private static void traversalInorder(Node node) {
        if (node != null) {
            traversalInorder(node.left);    
            System.out.print(node.name);
            traversalInorder(node.right);    
        }
    }
    
    private static void traversalPostorder(Node node) {
        if (node != null) {
            traversalPostorder(node.left);
            traversalPostorder(node.right);
            System.out.print(node.name);
        }
    }
}

'Computer Sciences > Problem Solve' 카테고리의 다른 글

[Baekjoon] 2193번: 이친수  (0) 2023.05.20
[Baekjoon] 9657번: 돌 게임 3  (0) 2023.05.12
[Baekjoon] 1912번: 연속합  (2) 2023.05.10
[Programmers] 택배 배달과 수거하기  (0) 2023.05.02
[Programmers] 미로 탈출  (0) 2023.05.01