문제
이진 트리를 입력받아 전위 순회(preorder traversal), 중위 순회(inorder traversal), 후위 순회(postorder traversal)한 결과를 출력하는 프로그램을 작성하시오.
예를 들어 위와 같은 이진 트리가 입력되면,
- 전위 순회한 결과 : ABDCEFG // (루트) (왼쪽 자식) (오른쪽 자식)
- 중위 순회한 결과 : DBAECFG // (왼쪽 자식) (루트) (오른쪽 자식)
- 후위 순회한 결과 : DBEGFCA // (왼쪽 자식) (오른쪽 자식) (루트)
가 된다.
입력
첫째 줄에는 이진 트리의 노드의 개수 N(1 ≤ N ≤ 26)이 주어진다. 둘째 줄부터 N개의 줄에 걸쳐 각 노드와 그의 왼쪽 자식 노드, 오른쪽 자식 노드가 주어진다. 노드의 이름은 A부터 차례대로 알파벳 대문자로 매겨지며, 항상 A가 루트 노드가 된다. 자식 노드가 없는 경우에는 .으로 표현한다.
출력
첫째 줄에 전위 순회, 둘째 줄에 중위 순회, 셋째 줄에 후위 순회한 결과를 출력한다. 각 줄에 N개의 알파벳을 공백 없이 출력하면 된다.
자바를 이용해 트리를 직접 구현하여 문제를 풀 수 있다.
public class BOJ_1991 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
Tree tree = new Tree();
for (int i = 0; i < N; i++) {
String treeMake = br.readLine();
StringTokenizer tokenizer = new StringTokenizer(treeMake, " ");
tree.addNode(tokenizer.nextToken(), tokenizer.nextToken(), tokenizer.nextToken());
}
tree.preOrder(tree.root);
System.out.println();
tree.inOrder(tree.root);
System.out.println();
tree.postOrder(tree.root);
}
}
#1.
N개의 자연수를 입력받아 N만큼 반복문을 돌린다.
StringTokenizer를 사용해 공백을 기준으로 단어를 하나씩 나누어 트리에 삽입한다.
class Node{
String data;
Node right;
Node left;
public Node(String data){
this.data = data;
}
}
#2.
노드 클래스는 입력받은 노드에 데이터를 저장하고
트리 클래스에서 왼쪽 하위 노드와 오른쪽 하위 노드를 연결하였다.
class Tree{
Node root;
public void addNode(String mid, String left, String right){
if(root == null){
if(!mid.equals("."))
root = new Node(mid);
if(!left.equals("."))
root.left = new Node(left);
if(!right.equals("."))
root.right = new Node(right);
}
else{
search(root, mid, left, right);
}
}
public void search(Node root, String mid, String left, String right){
if(root == null) return;
if(root.data.equals(mid)){
if(!left.equals("."))
root.left = new Node(left);
if(!right.equals("."))
root.right = new Node(right);
}
else{
search(root.left, mid, left, right);
search(root.right, mid, left, right);
}
}
public void preOrder(Node root) {
if (root != null) {
System.out.print(root.data);
preOrder(root.left);
preOrder(root.right);
}
}
public void inOrder(Node root) {
if (root != null) {
inOrder(root.left);
System.out.print(root.data);
inOrder(root.right);
}
}
public void postOrder(Node root) {
if (root != null) {
postOrder(root.left);
postOrder(root.right);
System.out.print(root.data);
}
}
}
#3.
입력받은 문자열이 "."이라면 해당 노드에 들어갈 값이 없는 것으로
"."이 아닌 경우에만 해당 위치에 값을 추가한다.
#4.
mid와 값을 비교하여 각 하위 노드를 알맞는 위치에 추가시켜준다.
#5.
전위, 중위, 후위 순회는 모두 null값을 비교하여 트리가 존재하는 경우에만 방문한다.
백준에 자바로 제출 시 main메서드가 포함된 클래스는 Main으로 하며 추가해야 하는 패키지가 있을 경우 꼭 import를 붙여야 제대로 제출이 된다. 위 코드의 경우 [java.io.*], [java.util.StringTokenizer] 를 import해야만 성공이 된다.
'CodingTest > BOJ' 카테고리의 다른 글
[백준] 1260번 DFS와 BFS - 자바, 인접리스트 이용 (0) | 2023.07.30 |
---|---|
[백준] 1931번 회의실 배정 (Greedy) (0) | 2023.07.29 |
[백준] 1158번 요세푸스 문제 - 자바 Queue 사용 (0) | 2023.07.26 |
[백준] 10828번 스택 - 자바 문제 풀이 (Stack, List) (0) | 2023.07.24 |
[백준] 1927번 최소 힙 - 자바 PriorityQueue 사용 (0) | 2023.02.07 |