티스토리 뷰

알고리즘

트리 순회하기

잔잔한 물결처럼 2025. 2. 9. 03:25

트리의를 순회하는 방법은 3가지가 있다

1. 전위 순회 : Root -> Left -> Right

2. 중위 순회 : Left -> Root -> Right

3. 후위 순회 : Left -> Root -> Right

외우는 방법

전위순회는 root 가 앞에

중위는 root 가 중간에

후위는 root 가 뒤에

전위순회한 결과 : ABDCEFG

중위순회한 결과 : DBAECFG

후위순회한 결과 : DBEGFCA

 

# 문제

1991번 : 트리 순회하기

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

설명 : 단순히 트리를 순회하는 코드를 작성하는 문제이다.

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

// Node 클래스: 트리의 각 노드를 정의
class Node {
    String name; // 노드 이름
    Node left;   // 왼쪽 자식 노드
    Node right;  // 오른쪽 자식 노드

    public Node(String name) {
        this.name = name;
    }
}

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

        // 1. 트리의 노드 개수 입력
        int nodeCount = Integer.parseInt(br.readLine());

        // 2. 트리를 저장할 리스트 생성 (노드 이름은 'A', 'B', 'C' 등으로 초기화)
        List<Node> tree = new ArrayList<>();
        for (int i = 0; i < nodeCount; i++) {
            tree.add(new Node(String.valueOf((char) ('A' + i))));
        }

        // 3. 각 노드의 연결 정보 입력 및 트리 구성
        for (int i = 0; i < nodeCount; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            String rootName = st.nextToken();   // 현재 루트 노드 이름
            String leftName = st.nextToken();  // 왼쪽 자식 노드 이름
            String rightName = st.nextToken(); // 오른쪽 자식 노드 이름

            // 현재 루트 노드를 가져옴
            Node rootNode = tree.get(rootName.charAt(0) - 'A');

            // 왼쪽 자식이 "."이 아니면 연결
            if (!leftName.equals(".")) {
                rootNode.left = tree.get(leftName.charAt(0) - 'A');
            }

            // 오른쪽 자식이 "."이 아니면 연결
            if (!rightName.equals(".")) {
                rootNode.right = tree.get(rightName.charAt(0) - 'A');
            }
        }

        // 4. 전위 순회, 중위 순회, 후위 순회 결과 출력
        System.out.println(preOrder(tree.get(0))); // 루트부터 시작
        System.out.println(inOrder(tree.get(0)));
        System.out.println(postOrder(tree.get(0)));
    }

    // 전위 순회 (Pre-order): 루트 → 왼쪽 → 오른쪽
    static String preOrder(Node currentNode) {
        if (currentNode == null) return ""; // 현재 노드가 null이면 종료
        return currentNode.name + preOrder(currentNode.left) + preOrder(currentNode.right);
    }

    // 중위 순회 (In-order): 왼쪽 → 루트 → 오른쪽
    static String inOrder(Node currentNode) {
        if (currentNode == null) return ""; // 현재 노드가 null이면 종료
        return inOrder(currentNode.left) + currentNode.name + inOrder(currentNode.right);
    }

    // 후위 순회 (Post-order): 왼쪽 → 오른쪽 → 루트
    static String postOrder(Node currentNode) {
        if (currentNode == null) return ""; // 현재 노드가 null이면 종료
        return postOrder(currentNode.left) + postOrder(currentNode.right) + currentNode.name;
    }
}

 

'알고리즘' 카테고리의 다른 글

세그먼트 트리 합구하기  (0) 2025.02.14
세그먼트 트리  (0) 2025.02.13
숨바꼭질 3  (0) 2025.02.13
노드사이의 거리  (0) 2025.02.11
플로이드 워셜  (0) 2025.02.10
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함