[BOJ] 1991 트리 순회

mingggkeee·2022년 2월 9일
0

BOJ 트리 순회

난이도 : 실버 1
유형 : 트리

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

문제

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

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

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

입력

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

출력

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

풀이

  • 전위순회는 루트-> 좌 -> 우
  • 중위순회는 좌 -> 루트 -> 우
  • 후외순회는 좌 -> 우-> 루트

코드

/**
 * BOJ_1991_S1_트리 순회
 * @author mingggkeee
 * 트리 구현, 순회 구현
 */

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

public class BOJ_1991 {

	static class Node {
		char data;
		Node Left, Right;

		public Node(char data) {
			this.data = data;
		}
	}

	static class Tree {
		Node root; // null 상태

		public void AddNode(char data, char leftData, char rightData) {
			if (root == null) { // A 루트 노드 생성
				root = new Node(data);
				
				if (leftData != '.') {
					root.Left = new Node(leftData);
				}
				if (rightData != '.') {
					root.Right = new Node(rightData);
				}
			} else { // 위치 찾기 - A 루트 노드 이후
				Search(root, data, leftData, rightData);
			}
		}

		public void Search(Node root, char data, char leftData, char rightData) {
			if (root == null) { // 도착 노드 null이면 재귀 종료 - 삽입할 노드 X
				return;
			} else if (root.data == data) { // 들어갈 위치
				if (leftData != '.') {
					root.Left = new Node(leftData);
				}
				if (rightData != '.') {
					root.Right = new Node(rightData);
				}
			} else { // 탐색할 노드가 남아 있는 경우
				Search(root.Left, data, leftData, rightData); // 왼쪽 재귀 탐색
				Search(root.Right, data, leftData, rightData); // 오른쪽 재귀 탐색
			}
		}

		// 전위순회 : 루트 -> 좌 -> 우
		public void PreOrder(Node root) throws IOException {
			System.out.print(root.data); 
			if (root.Left != null)
				PreOrder(root.Left); 
			if (root.Right != null)
				PreOrder(root.Right); 
		}

		// 중위순회 : 좌 -> 루트 -> 우
		public void InOrder(Node root) throws IOException {
			if (root.Left != null)
				InOrder(root.Left); 
			System.out.print(root.data); 
			if (root.Right != null)
				InOrder(root.Right); 
		}

		// 후위순회 : 좌 -> 우 -> 루트
		public void PostOrder(Node root) throws IOException {
			if (root.Left != null)
				PostOrder(root.Left); 
			if (root.Right != null)
				PostOrder(root.Right); 
			System.out.print(root.data); 
		}
	}

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

		Tree tree = new Tree();

		for (int i = 0; i < N; i++) {
			char[] data = new char[3];
			st = new StringTokenizer(br.readLine());
			data[0] = st.nextToken().charAt(0);
			data[1] = st.nextToken().charAt(0);
			data[2] = st.nextToken().charAt(0);
			tree.AddNode(data[0], data[1], data[2]);
		}

		tree.PreOrder(tree.root);
		System.out.println();

		tree.InOrder(tree.root);
		System.out.println();

		tree.PostOrder(tree.root);

		br.close();
	}
}
profile
만반잘부

0개의 댓글