Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 채팅GPT
- 자료구조
- 스프링 입문강의
- JAVA 기초
- 챗GPT 명령어 작성팁
- 조건문과 반복문
- Til
- ChatGPT
- 이것이 자바다
- 객체지향
- 이것이 자바다 연습문제
- 자바 언어 기초
- ArrayList 개념
- 트리 지름 구하기
- 이노베이션캠프 동북
- Java
- 웹개발 기본지식
- 자바
- 이것이 자바다 확인문제
- Comparable과 Comparable
- 이노베이션 캠프
- BFS
- 3장 확인문제
- 백준
- 자바의 정석 6장
- 이것이 자바다 13장
- 인프런
- 이노베이션캠프
- dfs
- 이노캠
Archives
- Today
- Total
기록공간
[백준 1991] 트리 순회 (JAVA) 본문
반응형
문제
이진 트리를 입력받아 전위 순회(preorder traversal), 중위 순회(inorder traversal), 후위 순회(postorder traversal)한 결과를 출력하는 프로그램을 작성하시오.

예를 들어 위와 같은 이진 트리가 입력되면,
- 전위 순회한 결과 : ABDCEFG // (루트) (왼쪽 자식) (오른쪽 자식)
- 중위 순회한 결과 : DBAECFG // (왼쪽 자식) (루트) (오른쪽 자식)
- 후위 순회한 결과 : DBEGFCA // (왼쪽 자식) (오른쪽 자식) (루트)
입력
첫째 줄에는 이진 트리의 노드의 개수 N(1 ≤ N ≤ 26)이 주어진다. 둘째 줄부터 N개의 줄에 걸쳐 각 노드와 그의 왼쪽 자식 노드, 오른쪽 자식 노드가 주어진다. 노드의 이름은 A부터 차례대로 알파벳 대문자로 매겨지며, 항상 A가 루트 노드가 된다. 자식 노드가 없는 경우에는 .으로 표현한다.
출력
첫째 줄에 전위 순회, 둘째 줄에 중위 순회, 셋째 줄에 후위 순회한 결과를 출력한다. 각 줄에 N개의 알파벳을 공백 없이 출력하면 된다.

문제 접근 방법
왼쪽자식노드 오른쪽자식 노드, 현재 노드의 값을 저장하기 위한 이진 트리 자료구조를 직접 구현해야한다.
7번의 반복을 통해, 각 문자들을 String 배열에 담은후, 1번째 문자는, 루트노드, 2번째 문자는 왼쪽 자식노드 3번째 문자는 오른쪽 자식노드 등, 이러한 이진트리 노드를 추가하는 메소드를 구현하였다.
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
import java.util.*;
class TreeNode { // 왼쪽 서브트리와 오른쪽 서브트리, 현재 value를 필드로하는 클래스 선언
char val;
TreeNode left;
TreeNode right;
public TreeNode(char val) {
this.val = val;
}
}
class BinaryTree { // 이진 트리
public TreeNode root;
public void addNode(char val, char leftVal, char rightVal) {
if (root == null) {
root = new TreeNode(val);
}
TreeNode cur = findNode(val, root);
if (leftVal != '.') {
cur.left = new TreeNode(leftVal);
}
if (rightVal != '.') {
cur.right = new TreeNode(rightVal);
}
}
/* 주어진 val 값을 찾는 findNode 메소드 선언
해당 메소드는 재귀호출을 통해 left 서브트리의 val값, right 서브트리의 vale값을
가진 노드를 반환함
*/
public TreeNode findNode(char val, TreeNode node) {
if (node == null) {
return null;
}
if (node.val == val) {
return node;
}
TreeNode left = findNode(val, node.left);
if (left != null) {
return left;
}
TreeNode right = findNode(val, node.right);
if (right != null) {
return right;
}
return null;
}
//재귀 호출을 사용해서 전위 순회 메소드 선언
public void preorderTraversal(TreeNode node) {
if (node == null) {
return;
}
System.out.print(node.val);
preorderTraversal(node.left);
preorderTraversal(node.right);
}
//중위순회 메소드 선언
public void inorderTraversal(TreeNode node) {
if (node == null) {
return;
}
inorderTraversal(node.left);
System.out.print(node.val);
inorderTraversal(node.right);
}
//후위 순회 메소드
public void postorderTraversal(TreeNode node) {
if (node == null) {
return;
}
postorderTraversal(node.left);
postorderTraversal(node.right);
System.out.print(node.val);
}
}
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = Integer.parseInt(sc.nextLine());
BinaryTree tree = new BinaryTree();
for (int i = 0; i < n; i++) {
String[] input = sc.nextLine().split(" ");
tree.addNode(input[0].charAt(0), input[1].charAt(0), input[2].charAt(0));
}
tree.preorderTraversal(tree.root);
System.out.println();
tree.inorderTraversal(tree.root);
System.out.println();
tree.postorderTraversal(tree.root);
System.out.println();
}
}
|
cs |
반응형
'알고리즘' 카테고리의 다른 글
[백준] 1167 트리의 지름 (JAVA) (0) | 2023.03.26 |
---|---|
[백준 2178] 미로 탐색 (0) | 2023.03.25 |
[백준 1260] DFS와 BFS 프로그램 (0) | 2023.03.23 |