프로그래밍/백준

백준 1991번 : 트리 순회

GaeGim 2022. 8. 31. 00:50
반응형

[레벨4]

 

· 문제

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

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

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

가 된다.

 

· 입력

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

 

· 출력

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

 

· 풀이

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

public class Main {
	
	static class Node {
		int left;
		int right;

		public Node(int left, int right) {
			this.left = left;
			this.right = right;
		}
	}

	static List<Node>[] list;
	static StringBuilder sb = new StringBuilder();

	public static void main(String[] args) throws Exception {
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = null;
		
		int n = Integer.parseInt(br.readLine());

		list = new ArrayList[n + 1];
		
		for (int i = 1; i < n + 1; i++) {
			list[i] = new ArrayList<>();
		}

		for (int i = 1; i < n + 1; i++) {
			String[] line = br.readLine().split(" ");
			int data = line[0].charAt(0) - 'A' + 1;
			int left = line[1].charAt(0) - 'A' + 1;
			int right = line[2].charAt(0) - 'A' + 1;
			list[data].add(new Node(left, right));
		}

		pre(1);
		sb.append("\n");
		in(1);
		sb.append("\n");
		post(1);
		System.out.println(sb.toString());

	}

	// 전위 순회.
	static void pre(int start) {
		for (Node node : list[start]) {
			int l = node.left;
			int r = node.right;

			sb.append((char) (start + 'A' - 1));
			if (l != -18)
				pre(l);
			if (r != -18)
				pre(r);
		}
	}

	// 중위 순회.
	static void in(int start) {
		for (Node node : list[start]) {
			int l = node.left;
			int r = node.right;

			if (l != -18)
				in(l);
			sb.append((char) (start + 'A' - 1));
			if (r != -18)
				in(r);
		}
	}

	// 후위 순회.
	static void post(int start) {
		for (Node node : list[start]) {
			int l = node.left;
			int r = node.right;

			if (l != -18)
				post(l);
			if (r != -18)
				post(r);
			sb.append((char) (start + 'A' - 1));
		}
	}
}
반응형

'프로그래밍 > 백준' 카테고리의 다른 글

백준 15686번 : 치킨 배달  (0) 2022.08.31
백준 2407번 : 조합  (0) 2022.08.30
백준 15650번 : N과 M (2)  (0) 2022.08.30
백준 11053번 : 가장 긴 증가하는 부분 수열  (0) 2022.08.30
백준 12852번 : 1로 만들기 2  (0) 2022.08.30