알고리즘 문제 풀이를 블로그에 올리는 이유는 풀이, 코드를 기록하기 위함이니
앞으로 문제를 다 긁어오기보다 링크만 두고 풀이가 잘 보이도록 포스팅 할 예정입니다!
이 문제는 값을 입력 받아 이진 트리를 구현하고,
전위 순회(preorder traversal), 중위 순회(inorder traversal), 후위 순회(postorder traversal)한 결과를 출력하는 문제이다.
입력 예시는 다음과 같다.
7 => 총 7개의 노드가 입력됨
A B C => A 노드의 left는 B, right는 C
B D . => B 노드의 left는 D, right는 없음
C E F => C 노드의 left는 E, right는 F
E . . => E 노드의 left는 없음, right도 없음
F . G => F 노드의 left는 없음, right는 G
D . . => D 노드의 left는 없음, right도 없음
G . . => G 노드의 left는 없음, right도 없음
결과적으로 아래와 같은 이진 트리가 만들어진다.
위 이진 트리를 각각 전위 순회, 중위 순회, 후위 순회한 결과는 다음과 같다.
- 전위순회 Preorder : Root -> Left -> Right => ABDCEFG
- 중위순회 Inorder : Left -> Root -> Right => DBAECFG
- 후위순회 Postorder : Left -> Right -> Root => DBEGFCA
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
class Node{
char data;
Node left;
Node right;
Node(char data) {
this.data = data;
}
}
class Tree {
public Node root;
public void createNode(char data, char leftData, char rightData) {
if(root == null) {
root = new Node(data);
root.left = leftData != '.' ? new Node(leftData) : null;
root.right = rightData != '.' ? new Node(rightData) : null;
}else {
searchNode(root, data, leftData, rightData);
}
}
public void searchNode(Node node, char data, char leftData, char rightData) {
if(node == null) {
return;
}else if(node.data == data) {
node.left = leftData != '.' ? new Node(leftData) : null;
node.right = rightData != '.' ? new Node(rightData) : null;
}else {
searchNode(node.left, data, leftData, rightData); // 오른쪽 재귀 탐색
searchNode(node.right, data, leftData, rightData); // 왼쪽 재귀 탐색
}
}
// 전위순회 Preorder : Root -> Left -> Right
public void preOrder(Node node) {
if(node != null) {
System.out.print(node.data);
if(node.left != null) {preOrder(node.left);}
if(node.right != null) {preOrder(node.right);}
}
}
// 중위순회 Inorder : Left -> Root -> Right
public void inOrder(Node node) {
if(node != null) {
if(node.left != null) {inOrder(node.left);}
System.out.print(node.data);
if(node.right != null) {inOrder(node.right);}
}
}
// 후위순회 Postorder : Left -> Right -> Root
public void postOrder(Node node) {
if(node != null) {
if(node.left != null) {postOrder(node.left);}
if(node.right != null) {postOrder(node.right);}
System.out.print(node.data);
}
}
}
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
Tree t = new Tree();
for(int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
char root = st.nextToken().charAt(0);
char left = st.nextToken().charAt(0);
char right = st.nextToken().charAt(0);
t.createNode(root, left, right);
}
t.preOrder(t.root);
System.out.println();
t.inOrder(t.root);
System.out.println();
t.postOrder(t.root);
br.close();
}
}