1991번: 트리 순회
첫째 줄에는 이진 트리의 노드의 개수 N(1 ≤ N ≤ 26)이 주어진다. 둘째 줄부터 N개의 줄에 걸쳐 각 노드와 그의 왼쪽 자식 노드, 오른쪽 자식 노드가 주어진다. 노드의 이름은 A부터 차례대로 알파
www.acmicpc.net
풀이
<트리 자료구조 생성>
Node 클래스를 생성하고, 클래스 내에 String value, Node left, Node right 인스턴스 변수를 생성하여 각각 노드 값, 왼쪽 자식 노드, 오른쪽 자식 노드를 저장한다.
static class Node {
String value;
Node left;
Node right;
public Node(String value, Node left, Node right) {
this.value = value;
this.left = left;
this.right = right;
}
}
문제에서 "항상 A가 루트 노드가 된다"고 나와있기 때문에 static 변수로 루트 노드 Node root = new Node("A", null, null)을 생성한다.
static Node root = new Node("A", null, null); //트리의 루트 노드
각 노드와 그의 왼쪽 자식 노드, 오른쪽 자식 노드를 입력받을 때 insertNode() 함수를 호출하여 올바른 위치에 노드를 삽입한다.
static void insertNode(Node node, String parent, String left, String right) {
if (node.value.equals(parent)) {
node.left = left.equals(".") ? null : new Node(left, null, null);
node.right = right.equals(".") ? null : new Node(right, null, null);
}
else {
if (node.left != null)
insertNode(node.left, parent, left, right);
if (node.right != null)
insertNode(node.right, parent, left, right);
}
}
그 후 전위 순회, 중위 순회, 후위 순회를 한 결과를 출력하면 된다.
코드
import java.io.*;
import java.util.*;
public class Main {
static class Node {
String value;
Node left;
Node right;
public Node(String value, Node left, Node right) {
this.value = value;
this.left = left;
this.right = right;
}
}
static Node root = new Node("A", null, null); //트리의 루트 노드
static StringBuilder sb = new StringBuilder(); //출력 결과
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
StringTokenizer st;
for (int i = 0; i < n - 1; i++) {
st = new StringTokenizer(br.readLine());
String parent = st.nextToken();
String left = st.nextToken();
String right = st.nextToken();
insertNode(root, parent, left, right);
}
preOrder(root); //전위 순회
sb.append("\n");
inOrder(root); //중위 순회
sb.append("\n");
postOrder(root); //후위 순회
sb.append("\n");
System.out.println(sb);
}
static void insertNode(Node node, String parent, String left, String right) {
if (node.value.equals(parent)) {
node.left = left.equals(".") ? null : new Node(left, null, null);
node.right = right.equals(".") ? null : new Node(right, null, null);
}
else {
if (node.left != null)
insertNode(node.left, parent, left, right);
if (node.right != null)
insertNode(node.right, parent, left, right);
}
}
static void preOrder (Node node) {
if (node == null) return;
sb.append(node.value);
preOrder(node.left);
preOrder(node.right);
}
static void inOrder (Node node) {
if (node == null) return;
inOrder(node.left);
sb.append(node.value);
inOrder(node.right);
}
static void postOrder (Node node) {
if (node == null) return;
postOrder(node.left);
postOrder(node.right);
sb.append(node.value);
}
}
Reference
728x90
'Algorithm 문제 풀이 > 백준' 카테고리의 다른 글
[백준] 3190번 : 뱀 - 자바[Java] (0) | 2022.12.16 |
---|---|
[백준] 5639번 : 이진 검색 트리 - 자바[Java] (0) | 2022.11.21 |
[백준] 11725번 : 트리의 부모 찾기 - 자바[Java] (0) | 2022.11.20 |
[백준] 1197번 : 최소 스패닝 트리(MST) - 자바[Java] (0) | 2022.11.19 |
[백준] 13549번 : 숨바꼭질 3 - 자바[Java] (0) | 2022.11.19 |