문제
이진 트리를 입력받아 전위 순회(preorder traversal), 중위 순회(inorder traversal), 후위 순회(postorder traversal)한 결과를 출력하는 프로그램을 작성하시오.
예를 들어 위와 같은 이진 트리가 입력되면,
가 된다
입력
첫째 줄에는 이진 트리의 노드의 개수 N(1 ≤ N ≤ 26)이 주어진다. 둘째 줄부터 N개의 줄에 걸쳐 각 노드와 그의 왼쪽 자식 노드, 오른쪽 자식 노드가 주어진다. 노드의 이름은 A부터 차례대로 알파벳 대문자로 매겨지며, 항상 A가 루트 노드가 된다. 자식 노드가 없는 경우에는 .으로 표현한다.
7
A B C
B D .
C E F
E . .
F . G
D . .
G . .
출력
첫째 줄에 전위 순회, 둘째 줄에 중위 순회, 셋째 줄에 후위 순회한 결과를 출력한다. 각 줄에 N개의 알파벳을 공백 없이 출력하면 된다.
ABDCEFG
DBAECFG
DBEGFCA
접근 방식
char 알파벳과 왼쪽 노드 , 오른쪽 노드를 가진 노드 객체를 만들어 구현한다
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main_S1_1991 {
static Node head = new Node('A', null, null);
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
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);
insertNode(head, root,left,right);
}
preOrder(head);
System.out.println();
inOrder(head);
System.out.println();
postOrder(head);
System.out.println();
}
static class Node{
char value;
Node left;
Node right;
Node(char value, Node left, Node right){
this.value = value;
this.left = left;
this.right = right;
}
}
public static void insertNode(Node temp, char root, char left, char right) {
if (temp.value == root) {
temp.left = (left == '.' ? null : new Node(left,null,null));
temp.right = (right == '.' ? null : new Node(right,null,null));
}
else {
if(temp.left != null) insertNode(temp.left, root, left, right);
if(temp.right != null) insertNode(temp.right, root, left, right);
}
}
public static void preOrder(Node node) {
if(node ==null) return;
System.out.print(node.value);
preOrder(node.left);
preOrder(node.right);
}
public static void inOrder(Node node) {
if(node ==null) return;
inOrder(node.left);
System.out.print(node.value);
inOrder(node.right);
}
public static void postOrder(Node node) {
if(node ==null) return;
postOrder(node.left);
postOrder(node.right);
System.out.print(node.value);
}
}
코드 보다가 질문이 생겨 댓글 답니다..!
insertNode 메서드에서 if else를 없애고 삼항연산자 두줄만 있으면 뭐가 달라지는걸까요..? 알고리즘 입문자라 아무리 쳐다봐도 모르겠네요ㅜㅜ