백준 1991 : 트리 순회

전준형·2021년 3월 6일
0

백준

목록 보기
18/27

문제

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

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

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

접근

첫 접근은 역시 입력값을 토대로 트리를 구현하려했으나, 입력 자체가 이진 탐색 트리를 만들기엔 애로사항이 있었다. 차라리 트리를 만들지 않고 푸는 방식이 더 간단해 보였기에 그쪽 방식으로 접근하였다.

입력이 A노드에 B와 C노드가 연결되어있다는 식으로 나와있기에, n*3 배열을 만들어서 A노드는 0번배열, B노드는 1번 배열에 저장하는 식으로 자료구조를 형성하였다. 그 뒤로는 DFS의 형식으로 해결했다. A 노드부터 시작하게 되고, 전위 탐색이라면 현재 노드를 출력하고, 왼쪽노드 오른쪽 노드를 차례로 방문하고, 중위라면 왼쪽을 방문하고 현재노드를 출력한 뒤 오른쪽 노드를 방문, 후위라면 왼쪽 오른쪽을 방문하고 현재 노드를 출력하면 된다.

코드

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

public class Main {
	static int [][] grid;
	static boolean [][] check;
	
	public static void main(String[] args) throws IOException {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		
		int n = Integer.parseInt(bf.readLine());
		
		grid = new int[n][3];
		
		for(int i = 0; i < n; i++) {
			String str = bf.readLine();
			st = new StringTokenizer(str);
			
			char a = st.nextToken().charAt(0);
			char b = st.nextToken().charAt(0);
			char c = st.nextToken().charAt(0);
			
			int now = a - 'A';
			
			grid[now][0] = a;
			grid[now][1] = b;
			grid[now][2] = c;
		}
		
		pre(0);
		System.out.println();
		in(0);
		System.out.println();
		post(0);
	}

	private static void pre(int now) {
		System.out.print((char)grid[now][0]);
		if(grid[now][1] != '.') {
			pre(grid[now][1] - 'A');
		}
		if(grid[now][2] != '.') {
			pre(grid[now][2] - 'A');
		}
	}
	
	private static void in(int now) {
		if(grid[now][1] != '.') {
			in(grid[now][1] - 'A');
		}
		
		System.out.print((char)grid[now][0]);
		
		if(grid[now][2] != '.') {
			in(grid[now][2] - 'A');
		}
	}
	
	private static void post(int now) {
		if(grid[now][1] != '.') {
			post(grid[now][1] - 'A');
		}
		
		if(grid[now][2] != '.') {
			post(grid[now][2] - 'A');
		}
		
		System.out.print((char)grid[now][0]);
	}
}
profile
한방에 맞게 해주세요

1개의 댓글

comment-user-thumbnail
2021년 3월 8일

나 쭈펄 백준 레이팅 44점 나처럼 살지마시오.

답글 달기