일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- spring-boot
- 백준
- algorithm
- SWEA
- 2021.01.12
- 2021.01.06
- 2021.01.21
- 코드스쿼드 마스터즈
- baekjoon1541
- java
- 박재성
- 2021.01.22
- 2021.01.19
- 2021.01.11
- 마스터즈 2주차 회고
- 2021.01.13
- 잃어버린 괄호
- 백준 1149
- 알고리즘
- 알고리즘데이
- 코드스쿼드
- 쉽게 배우는 운영체제
- 2021.01.14
- 자바
- 백준 9093
- 2021.01.18
- Til
- 2020.01.08
- 2021.01.17
- 괄호
- Today
- Total
Cooper's devlog
트리 순회 : 1991번 - JAVA 본문
[문제 접근 방법]
이번 문제는 트리 순회 문제입니다.
이 문제는 이진트리로 전위 순회, 중위 순회, 후위 순회를 탐색하는 방식을 확인하고자 하는 문제 입니다.
문제에서 제시한 것을 다시 한 번 정리하면
- 전위 순회 : 루트 노드 → 왼쪽 자식 노드 → 오른쪽 자식 노드
- 중위 순회 : 왼쪽 자식 노드 → 루트 노드 → 오른쪽 자식 노드
- 후위 순회 : 왼쪽 자식 노드 → 오른쪽 자식 노드 →루트 노드
순으로 탐색을 한다로 문제에서 제시합니다.
문제 풀이 방식은 먼저
(1)트리를 구현하고
(2)전위(preOrder), 중위(inOrder), 후위(postOrder)로 출력하도록 하는
로직을 작성하는 방식으로 로직을 구성하면 되겠습니다.
[전체 코드]
import java.io.*;
import java.util.*;
public class Main {
static Map<Character, char[]> tree = new HashMap<>();
static StringBuilder sb = new StringBuilder();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int N = Integer.parseInt(br.readLine());
for (int i = 0; i < N; i++){
st = new StringTokenizer(br.readLine());
char[] node = new char[3];
node[0] = st.nextToken().charAt(0);
node[1] = st.nextToken().charAt(0);
node[2] = st.nextToken().charAt(0);
tree.put(node[0], node);
}
preOrder('A');
sb.append("\n");
inOrder('A');
sb.append("\n");
postOrder('A');
sb.append("\n");
System.out.println(sb.toString());
br.close();
}
private static void postOrder(char node) {
if(node == '.'){
return ;
}
postOrder(tree.get(node)[1]);
postOrder(tree.get(node)[2]);
sb.append(node);
}
private static void inOrder(char node) {
if(node == '.'){
return ;
}
inOrder(tree.get(node)[1]);
sb.append(node);
inOrder(tree.get(node)[2]);
}
private static void preOrder(char node) {
if(node == '.'){
return ;
}
sb.append(node);
preOrder(tree.get(node)[1]);
preOrder(tree.get(node)[2]);
}
}
[코드 세부 설명]
1. 트리를 구현한다.
static Map<Character, char[]> tree = new HashMap<>();
트리를 노드를 이용해서 구하는 방식이 있지만 이번 문제 풀이에는 HashMap을 이용해서 트리를 구현했습니다.
<Key, Value>를 가지는 HashMap 형태를 통해 트리를 구현한 것을 확인할 수 있습니다.
2. 전위(preOrder)방식 메소드
private static void preOrder(char node) {
if(node == '.'){
return ;
}
sb.append(node);
preOrder(tree.get(node)[1]);
preOrder(tree.get(node)[2]);
}
문제에서 제시해 준 것과 같이 루트 노드 → 왼쪽 자식 노드 → 오른쪽 자식 노드 순으로 메소드를 작성해줍니다.
나머지 아래의 코드 또한 문제에서 제시한 그대로 로직을 구현하도록 합니다.
3. 중위 순회(inOrder)방식 메소드
private static void inOrder(char node) {
if(node == '.'){
return ;
}
inOrder(tree.get(node)[1]);
sb.append(node);
inOrder(tree.get(node)[2]);
}
- 중위 순회 : 왼쪽 자식 노드 → 루트 노드 → 오른쪽 자식 노드
4. 후위(postOrder)방식 메소드
private static void postOrder(char node) {
if(node == '.'){
return ;
}
postOrder(tree.get(node)[1]);
postOrder(tree.get(node)[2]);
sb.append(node);
}
- 후위 순회 : 왼쪽 자식 노드 → 오른쪽 자식 노드 →루트 노드
[결과]
문제는 깔끔하게 정답인 것을 확인할 수 있습니다! 이 문제는 트리를 구현하는 연습용 문제로 사용하면 좋을 것 같고 기본적인 전위, 후위, 중위표현 방식은 기본적인 CS지식이므로 이번 기회를 통해서 숙지하시면 좋을 것 같습니다!
'Algorithm > Baekjoon' 카테고리의 다른 글
최단 경로 : 1753 - JAVA (0) | 2020.10.30 |
---|---|
양 구출 작전 : 16437번 - JAVA (0) | 2020.10.23 |
좋은 친구 : 3078번 - JAVA (0) | 2020.10.05 |
합이 0인 네 정수:7453 - JAVA (0) | 2020.10.03 |
사탕 게임:3085번 - JAVA (0) | 2020.07.21 |