개인 공부/백준

1991번 트리_순회

코딩하는 동훈 2024. 8. 9. 20:05

문제:

이진 트리를 입력받아 전위 순회(preorder traversal), 중위 순회(inorder traversal), 후위 순회(postorder traversal)한 결과를 출력하는 프로그램을 작성하시오.

예를 들어 위와 같은 이진 트리가 입력되면,

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

가 된다.

입력:

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

출력:

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

접근 방법

  1. 트리를 구현한다.
    1. 자신의 데이터를 저장하고 왼쪽 트리와 오른쪽 트리를 설정한다.
  2. 전위 순회, 중위 순회, 후위 순회를 시킨다.
    전위 순회란 부모트리 왼쪽트리 오른쪽트리가 존재할때 부모 왼쪽 오른쪽 순서로 데이터를 탐색하는것이다.
    중위 순회는 왼쪽 부모 오른쪽 순서 이고 후위 순회는 왼쪽 오른쪽 부모 이다. 결론은 왼쪽 오른쪽 사이에 어디에 있냐에 따라 탐색방법이 달라진다.

    코드

접기/펼치기

import java.util.Scanner;

class Tree{
    char data;
    Tree left;
    Tree right;

    Tree(char data)
    {
        this.data = data;
        this.left = null;
        this.right = null;
    }
}


public class 트리_순회{

    static int N;

    public static void main(String[] args)
    {

        Scanner sc = new Scanner(System.in);
        N = sc.nextInt();
        sc.nextLine();
        Tree [] tree = new Tree[N];
        for(int i = 0 ; i < N; i++)
        {
            tree[i] = new Tree((char) ('A' + i));
        }

        for(int i = 0 ; i < N ; i ++)
        {
            String [] str = sc.nextLine().split(" ");
            if(str[1].charAt(0) != '.')
            tree[str[0].charAt(0)-'A'].left = tree[str[1].charAt(0)-'A'];
            if(str[2].charAt(0) != '.')
            tree[str[0].charAt(0)-'A'].right = tree[str[2].charAt(0)-'A'];
        }

        prev(tree[0]);
        System.out.println();
        in(tree[0]);
        System.out.println();
        post(tree[0]);




        sc.close();
    }

    public static void prev(Tree root)
    {
        System.out.print(root.data);
        if(root.left != null)
        prev(root.left);
        if(root.right != null)
        prev(root.right);
    }

    public static void in(Tree root)
    {

        if(root.left != null)
        in(root.left);
        System.out.print(root.data);
        if(root.right != null)
        in(root.right);
    }


    public static void post(Tree root)
    {

        if(root.left != null)
        post(root.left);
        if(root.right != null)
        post(root.right);
        System.out.print(root.data);
    }


}