(백준)트리 순회(1991번)

류재환·2022년 7월 17일
0

https://www.acmicpc.net/problem/1991
//1 문제 분석

이진 트리가 주어졌을 때, 전위 순회, 중위 순회, 후위 순회를 각각 어떻게 구현할지에 관한 문제이다.

//2 문제 해결

이진 트리를 저장할 방법으로 Map<String,String[]>을 사용하였다. key값에는 그 지점의 문자, value에는 왼쪽 자식, 오른쪽 자식을 묶은 배열을 넣었다.
모든 순회는 루트에서 시작하여 왼쪽을 탐색하고 이후에 오른쪽을 탐색하는 재귀함수를 작성하였다.
전위 순회는 탐색하면서 값을 바로 출력하였고, 중위 순회는 왼쪽 순회가 끝나고 오른쪽 순회 시작하기전에 값을 출력하였고, 후위 순회는 오른쪽 순회도 끝나는 시점에 값을 출력하였다.

//3 작성 코드

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

public class TreeTraversal_1991 {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(br.readLine());
		StringTokenizer stz;
		Map<String, String[]> map = new HashMap<>();
		for (int i = 0 ; i<N ; i++) {
			stz = new StringTokenizer(br.readLine());
			map.put(stz.nextToken(), new String[] {stz.nextToken(),stz.nextToken()});
		}
		StringBuilder sb = new StringBuilder();
		frontTrav(map,sb,"A");
		sb.append("\n");
		midTrav(map,sb,"A");
		sb.append("\n");
		backTrav(map,sb,"A");
		System.out.println(sb);
		
	}
	static void frontTrav(Map<String,String[]> map, StringBuilder sb, String point) { 
		sb.append(point);
		String[] temp = map.get(point);
		if (!temp[0].equals(".")) frontTrav(map,sb,temp[0]);
		if (!temp[1].equals(".")) frontTrav(map,sb,temp[1]);
	}
	static void midTrav(Map<String,String[]> map, StringBuilder sb, String point) { 
		String[] temp = map.get(point);
		if (!temp[0].equals(".")) midTrav(map,sb,temp[0]);
		sb.append(point);
		if (!temp[1].equals(".")) midTrav(map,sb,temp[1]);
	}
	static void backTrav(Map<String,String[]> map, StringBuilder sb, String point) { 
		String[] temp = map.get(point);
		if (!temp[0].equals(".")) backTrav(map,sb,temp[0]);
		if (!temp[1].equals(".")) backTrav(map,sb,temp[1]);
		sb.append(point);
	}
}

//4 시행착오

순회에서 더 이상 탐색을 못하는 경우, "."을 만날 때를 판단하는 과정에서 temp=="."을 처음에 사용하여 오류가 발생하였다. String에서 같은지 비교할때는 .equals 메소드를 사용해야된다는걸 다시 명심하였다.

profile
비전공자의 개발자 도전기

0개의 댓글