Java/Baekjoon

[Baekjoon] 1991번 트리 순회 (Java)

다콩잉 2022. 8. 29. 00:40

예제 입력

7
A B C
B D .
C E F
E . .
F . G
D . .
G . .

예제 출력

ABDCEFG
DBAECFG
DBEGFCA

 

 

package Q1991;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;

class Node{
	String node;
	String left;
	String right;
	
	public Node(String[] str){	// 배열이 들어올 때마다 자신과 왼쪽 자식, 오른쪽 자식 지정
		this.node = str[0];
		this.left = str[1];
		this.right = str[2];
	}
}

public class Main {
	static int num = 0;
	static HashMap<String, Node> map;
	static ArrayList<String> arr = new ArrayList<String>();
	public static void main(String[] args)  throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		num = Integer.parseInt(br.readLine());
		String[] str = new String[3];
		map = new HashMap<String, Node>();
		for(int i = 0; i < num; i++) {
			str = br.readLine().split(" "); 	// 입력 받은 값 줄 별로 split해서 str[i]에 저장
			map.put(str[0], new Node(str));
		}

		// ------ 전위 ------ (루트 -> 왼쪽 -> 오른쪽)
		pre("A");			
		arr.removeAll(arr);
		System.out.println();
		// ------ 중위 ------ (왼쪽 -> 루트 -> 오른쪽)
		in("A");
		arr.removeAll(arr);
		System.out.println();
		// ------ 후위 ------ (왼쪽 -> 오른쪽 -> 루트)
		post("A");
		System.out.println("A");
	}	
	public static void pre(String parent) {
		String left = map.get(parent).left;
		String right = map.get(parent).right;
		if(!arr.contains(parent)) {		// 출력된적 없는 루트 노드 출력
			System.out.print(parent);
			arr.add(parent);
		}
		if(!left.equals(".")) {			// 왼쪽 자식이 있다면
			if(!arr.contains(left)) {	// 출력된적 없는 노드라면 출력하고 재귀
				System.out.print(left); arr.add(left); pre(left);
			}
		}else if(left.equals(".") && right.equals(".")){return;}	// 리프 노드라면 호출됐던 곳으로 되돌아감.
		if(!right.equals(".")) {		// 오른쪽 자식이 있다면
			if(!arr.contains(right)) {	// 출력된적 없는 노드라면 출력하고 재귀
				System.out.print(right); arr.add(right); pre(right);
			}
		}else {return;}					// 오른쪽 자식이 없다면 호출됐던 곳으로 되돌아감(부모 노드)
	}
	public static void in(String parent) {
		String left = map.get(parent).left;
		String right = map.get(parent).right;
		if(!left.equals(".")) {			// 왼쪽 자식이 존재한다면
			in(left);					// 재귀(가장 왼쪽부터 탐색해야 하기 때문)
			if(!arr.contains(parent)) {	
				System.out.print(parent);
				arr.add(parent);
			}
		}else if(left.equals(".")) {	// 왼쪽 자식이 존재하지 않는 경우
			if(!arr.contains(parent)) {	// 부모 노드가 출력된 적이 없다면 출력
				System.out.print(parent); arr.add(parent);
				if(!right.equals(".")) { in(right); }	// 오른쪽 자식이 존해하는 경우 재귀
				return;					// 아닌 경우 호출됐던 곳으로 되돌아감
			}			
		}
		if(!right.equals(".")) {		// 오른쪽 자식이 존재한다면 재귀
			in(right);
		}else if(right.equals(".")) {	// 오른쪽 자식이 존재하지 않고 부모 노드가 출력된적이 없다면 출력
			if(!arr.contains(parent)) { System.out.print(parent); arr.add(parent); }
			return;
		}
	}
	public static void post(String parent) {
		String left = map.get(parent).left;
		String right = map.get(parent).right;
		if(!left.equals(".")) {		// 왼쪽 자식이 존재하면 재귀(left)	-> 왼쪽 리프노드부터 탐색해야 하기 때문
			post(left);
			if(!arr.contains(left)) {
				System.out.print(left); arr.add(left);
			}
		}else if(left.equals(".") && !right.equals(".")) {	// 왼쪽 자식 존재 x, 오른쪽 자식 존재 o -> 재귀(right)
			post(right);
			if(!arr.contains(right)) {
				System.out.print(right); arr.add(right);
			}
		}else {return;}	
		
		if(!right.equals(".")) {	// 오른쪽 존재하면 재귀(right)
			post(right);
			if(!arr.contains(right)) {
				System.out.print(right); arr.add(right);
			}
		}else {return;}
	}
}
728x90