https://www.acmicpc.net/problem/1991
[정답 코드]
import java.io.*;
import java.util.*;
public class Main {
static Node head = new Node('A', null, null); // 트리는 A부터 시작
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int N = Integer.parseInt(st.nextToken());
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine(), " ");
char root = st.nextToken().charAt(0);
char left = st.nextToken().charAt(0);
char right = st.nextToken().charAt(0);
insertNode(head, root, left, right);
}
preOrder(head);
System.out.println();
inOrder(head);
System.out.println();
postOrder(head);
System.out.println();
}
static class Node {
char value;
Node left;
Node right;
Node(char value, Node left, Node right) {
this.value = value;
this.left = left;
this.right = right;
}
}
public static void insertNode(Node tmp, char root, char left, char right) {
if (tmp.value == root) {
tmp.left = (left == '.' ? null : new Node(left, null, null));
tmp.right = (right == '.' ? null : new Node(right, null, null));
} else {
if (tmp.left != null) {
insertNode(tmp.left, root, left, right);
}
if (tmp.right != null) {
insertNode(tmp.right, root, left, right);
}
}
}
private static void preOrder(Node node) {
if (node == null) { // 더 이상 값이 없을 때 까지
return;
}
System.out.print(node.value); // 출력
preOrder(node.left); // 왼쪽 노드 탐색
preOrder(node.right); // 오른쪽 노드 탐색
}
private static void inOrder(Node node) {
if (node == null) { // 더 이상 값이 없을 때 까지
return;
}
inOrder(node.left); // 왼쪽 노드 탐색
System.out.print(node.value); // 출력
inOrder(node.right); // 오른쪽 노드 탐색
}
private static void postOrder(Node node) {
if (node == null) { // 더 이상 값이 없을 때 까지
return;
}
postOrder(node.left); // 왼쪽 노드 탐색
postOrder(node.right); // 오른쪽 노드 탐색
System.out.print(node.value); // 출력
}
}
[설명]
트리를 순회하는 문제이다. 트리 탐색의 아주 기초문제이지만 너무 오랜만에 풀어서 도저히 풀 수가 없어 다른 글을 참고했다.
먼저 해결 방법은 다음과 같다.
1. Node 클래스를만든다.
- Node 클래스는char value, Node left, Node right 구조를 가진 클래스이다.
2. Node 클래스에 insertNode메서드를 활용해 값을 입력한다.
- insertNode는 (Node tmp, char root, char left, char right) 매개변수를 가지는데
맨 처음 선언한 Node head 를 기준으로 null 이 아닌 노드를 계속 탐색한다.
입력한 char root 값이 어떠한 Node의 value라면 그 노드의 왼쪽 노드와 오른쪽 노드에
값을 집어 넣는다.
3. 전위 순회 ,중위 순회 ,후위 순회 메서드를 각 각 사용해 출력한다.
- 전위 순회 : 루트 -> 왼쪽 노드 -> 오른쪽 노드 순서
중위 순회 : 왼쪽 노드 -> 루트 -> 오른쪽 노드 순서
후위 순회 : 왼쪽 노드 -> 오른쪽 노드 -> 루트 순서
디버깅모드로 차근차근 이해해보면 금방 이해할 수 있다.
'코딩테스트' 카테고리의 다른 글
백준 1260번: DFS와 BFS[JAVA] (0) | 2024.03.20 |
---|---|
백준 1068번: 트리[JAVA] (1) | 2024.03.15 |
백준 16234번: 인구 이동[JAVA] (1) | 2024.03.13 |
백준 2493번: 탑[JAVA] (0) | 2024.03.12 |
백준 7682번: 틱택토[JAVA] (0) | 2024.03.11 |