🔺 문제
1991번: 트리 순회
첫째 줄에는 이진 트리의 노드의 개수 N(1 ≤ N ≤ 26)이 주어진다. 둘째 줄부터 N개의 줄에 걸쳐 각 노드와 그의 왼쪽 자식 노드, 오른쪽 자식 노드가 주어진다. 노드의 이름은 A부터 차례대로 알파
www.acmicpc.net
🔺 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
import java.util.*;
import java.io.*;
public class Main {
static int[][] tree;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
tree = new int[26][2];
for(int i = 0 ; i < n ; i++) {
String[] tmp = br.readLine().split(" ");
int node = tmp[0].charAt(0) - 'A';
char left = tmp[1].charAt(0);
char right = tmp[2].charAt(0);
if(left == '.') tree[node][0] = -1;
else tree[node][0] = left - 'A';
if(right == '.') tree[node][1] = -1;
else tree[node][1] = right - 'A';
}
preOrder(0);
System.out.println();
inOrder(0);
System.out.println();
postOrder(0);
System.out.println();
}
// 전위 순회
public static void preOrder(int now) {
if(now == -1) return;
System.out.print((char) (now + 'A')); // 1. 현재 노드
preOrder(tree[now][0]); // 2. 왼쪽 탐색
preOrder(tree[now][1]); // 3. 오른쪽 탐색
}
// 중위 순회
public static void inOrder(int now) {
if(now == -1) return;
inOrder(tree[now][0]); // 1. 왼쪽 탐색
System.out.print((char) (now + 'A')); // 2. 현재 노드
inOrder(tree[now][1]); // 3. 오른쪽 탐색
}
// 후위 순회
public static void postOrder(int now) {
if(now == -1) return;
postOrder(tree[now][0]); // 1. 왼쪽 탐색
postOrder(tree[now][1]); // 2. 오른쪽 탐색
System.out.print((char) (now + 'A')); // 3. 현재 노드
}
}
|
cs |
✅ 해결 아이디어
✔ 전위 순회 : 루트 → L → R / 중위 순회 : L → 루트 → R / 후위 순회 : L → R → 루트
- 2차원 배열 사용했으나, 클래스로 노드 구현해도 괜찮음
🔺 다른 풀이들
- 클래스로 노드를 구현해 푸셨다 (Node 클래스 변수 - char value, Node left, Node right)
[Java] 백준 / 트리 순회 / 1991번
문제트리 순회 문제 링크이진 트리를 입력받아 전위 순회(preorder traversal), 중위 순회(inorder traversal), 후위 순회(postorder traversal)한 결과를 출력하는 프로그램을 작성하시오.https://www.acmicp
velog.io
- 과정 설명이 굿 (복습용)
백준 1991 트리 순회 Java
https://www.acmicpc.net/problem/1991 1991번: 트리 순회 첫째 줄에는 이진 트리의 노드의 개수 N(1 ≤ N ≤ 26)이 주어진다. 둘째 줄부터 N개의 줄에 걸쳐 각 노드와 그의 왼쪽 자식 노드, 오른쪽 자식 노드가
dhbang.tistory.com
- 이해하기 좋은 풀이... (Node 클래스 변수 - char left, char right)
로그인
www.acmicpc.net
- dfs 활용하심 ... 신기방기
로그인
www.acmicpc.net
💬 느낀 점
다음엔 잘 풀 수 있을 것 같다!
1회독 | 2회독 | 3회독 | 4회독 | 5회독 |
V | 6/29 |
(+6/29 2회독)
음.. 쉽지 않구만.. 위 코드랑 거의 차이 없는데 삼항 연산자 써줬음
import java.util.*;
import java.io.*;
public class Main {
static int[][] tree;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
tree = new int[26][2];
while(N-->0) {
String[] tmp = br.readLine().split(" ");
int node = tmp[0].charAt(0) - 'A';
char left = tmp[1].charAt(0);
char right = tmp[2].charAt(0);
tree[node][0] = (left == '.') ? -1 : (left - 'A');
tree[node][1] = (right == '.') ? -1 : (right - 'A');
}
preOrder(0);
System.out.println();
inOrder(0);
System.out.println();
postOrder(0);
System.out.println();
}
// 전위 순회
private static void preOrder(int now) {
if(now == -1) return;
System.out.print((char) (now + 'A')); // 1. 현재 노드
preOrder(tree[now][0]); // 2. 왼쪽 탐색
preOrder(tree[now][1]); // 3. 오른쪽 탐색
}
// 중위 순회
private static void inOrder(int now) {
if(now == -1) return;
inOrder(tree[now][0]); // 1. 왼쪽 탐색
System.out.print((char) (now + 'A')); // 2. 현재 노드
inOrder(tree[now][1]); // 3. 오른쪽 탐색
}
// 후위 순회
private static void postOrder(int now) {
if(now == -1) return;
postOrder(tree[now][0]); // 1. 왼쪽 탐색
postOrder(tree[now][1]); // 2. 오른쪽 탐색
System.out.print((char) (now + 'A')); // 3. 현재 노드
}
}
|
cs |