import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
class Main {
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);
}
}
BufferedReader와 StringTokenizer를 사용하여 입력을 받는다다.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
static Node head = new Node('A', null, null);
insertNode 메소드는 트리에 노드를 삽입하는 역할을 한다.
재귀적으로 트리를 탐색하여 입력받은 부모 노드를 찾고, 해당 노드에 왼쪽 또는 오른쪽 자식 노드를 추가한다. 자식 노드가 '.'인 경우에는 해당 자식 노드를 null로 설정한다.
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);
}
전위 순회는 루트를 먼저 방문하고, 왼쪽 자식, 오른쪽 자식 순으로 순회한다.
중위 순회는 왼쪽 자식을 먼저 방문하고, 루트, 오른쪽 자식 순으로 순회한다.
후위 순회는 왼쪽 자식, 오른쪽 자식을 먼저 방문하고, 마지막으로 루트를 방문한다.
preOrder(head);
System.out.println();
inOrder(head);
System.out.println();
postOrder(head);
System.out.println();