Trees

5-1: 트리순회 결과 출력하기

SWC123 2018. 10. 24. 20:22

트리순회 결과 출력하기

 

문제


루트가 0인 이진트리가 주어질 때, 이를 전위순회, 중위순회, 후위순회한 결과를 각각 출력하는 프로그램을 작성하시오. 아래 그림은 이진트리의 예제와, 이 이진트리를 전위순회, 중위순회, 후위순회 한 결과를 나타낸다.

alt text

 

입력


첫 번째 줄에 트리의 노드 개수 n이 주어진다. ( 1 ≤ n ≤ 100 ) 두 번째 줄부터 트리의 정보가 주어진다. 각 줄은 3개의 숫자 a, b, c로 이루어지며, 그 의미는 노드 a의 왼쪽 자식노드가 b, 오른쪽 자식노드가 c라는 뜻이다. 자식노드가 존재하지 않을 경우에는 -1이 주어진다.

 

출력


첫 번째 줄에 전위순회, 두 번째 줄에 중위순회, 세 번째 줄에 후위순회를 한 결과를 출력한다.

 

예제 입력

6
0 1 2
1 3 4
2 -1 5
3 -1 -1
4 -1 -1
5 -1 -1

예제 출력

0 1 3 4 2 5
3 1 4 0 2 5
3 4 1 5 2 0


import java.util.Scanner;

public class TreeTraversal {

/**
*
* 문제: 루트가 0인 이진트리가 주어질 때, 이를 전위순회, 중위순회, 후위순회한 결과를 각각 출력하는 프로그램을 작성하시오. 아래 그림은 이진트리의 예제와, 이 이진트리를 전위순회, 중위순회, 후위순회 한 결과를 나타낸다.
*
*
* 입력:
* 첫 번째 줄에 트리의 노드 개수 n이 주어진다. ( 1 ≤ n ≤ 100 )
* 두 번째 줄부터 트리의 정보가 주어진다. 각 줄은 3개의 숫자 a, b, c로 이루어지며, 그 의미는 노드 a의 왼쪽 자식노드가 b, 오른쪽 자식노드가 c라는 뜻이다. 자식노드가 존재하지 않을 경우에는 -1이 주어진다.
*
* 출력:
* 첫 번째 줄에 전위순회, 두 번째 줄에 중위순회, 세 번째 줄에 후위순회를 한 결과를 출력한다.
*
* 예제 입력:
* 6
* 0 1 2
* 1 3 4
* 2 -1 5
* 3 -1 -1
* 4 -1 -1
* 5 -1 -1
*
* 예제 출력:
* 0 1 3 4 2 5
* 3 1 4 0 2 5
* 3 4 1 5 2 0
*
* @param args
*/

public static void main(String[] args) {
Scanner sc = new Scanner(System.in);

int N = sc.nextInt();
TreeNode[] nodes = new TreeNode[N];

for (int i=0; i<N; i++){
int curData = sc.nextInt();
int leftData = sc.nextInt();
int rightData = sc.nextInt();

if (nodes[curData] == null){
TreeNode node = new TreeNode(curData);
nodes[curData] = node;
}

if (leftData == -1){
nodes[curData].left = null;
} else {
if (nodes[leftData] == null){
TreeNode node = new TreeNode(leftData);
nodes[leftData] = node;
nodes[curData].left = nodes[leftData];
}
}

if (rightData == -1){
nodes[curData].right = null;
} else{
if (nodes[rightData] == null){
TreeNode node = new TreeNode(rightData);
nodes[rightData] = node;
nodes[curData].right = nodes[rightData];
}
}
}

preorder(nodes[0]);
System.out.println();

inorder(nodes[0]);
System.out.println();

postorder(nodes[0]);

}

private static void preorder(TreeNode node) {
if (node == null) return;
System.out.print(node.data +" ");
preorder(node.left);
preorder(node.right);
}

private static void inorder(TreeNode node) {
if (node == null) return;
inorder(node.left);
System.out.print(node.data +" ");
inorder(node.right);
}

private static void postorder(TreeNode node) {
if (node == null) return;
postorder(node.left);
postorder(node.right);
System.out.print(node.data +" ");
}

public static class TreeNode{
int data;
TreeNode left;
TreeNode right;

public TreeNode(int data){
this.data = data;
}
}
}