Algorithm/Java

[백준/JAVA] 1991번: 트리 순회

dbfl9911 2024. 7. 12. 14:05
반응형

- 정답 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;

public class Main {
    static int N;
    static StringTokenizer st;
    static Map<String, Node> nodeMap = new HashMap<>(); // 노드 정보 저장 

    public static class Node{
        String data; // 노드 데이터
        Node left; // 왼쪽 자식 노드
        Node right; // 오른쪽 자식 노드 

        // 초기화
        public Node(String data){
            this.data = data;
            this.left = null;
            this.right = null;
        }
    }

     // 전위순회(루트 - 왼 - 오)
     public static void preOrder(Node node) {
        if(node == null) return; // 자식 노드 없는 경우 순회 종료 
        System.out.printf(node.data); // 현재 노드 방문
        preOrder(node.left); // 왼쪽 노드 방문
        preOrder(node.right); // 오른쪽 노드 방문 
     }

     // 중위순회(왼 - 루트 - 오)
     public static void inOrder(Node node) {
        if(node == null) return;
        inOrder(node.left);
        System.out.printf(node.data);
        inOrder(node.right);
     }

     // 후위순회(왼 - 오 - 루트)
     public static void postOrder(Node node) {
        if(node == null) return;
        postOrder(node.left);
        postOrder(node.right);
        System.out.printf(node.data);
     }

    public static void main(String[] args)  throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(br.readLine());

        for(int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine()); // ABC
            String parent = st.nextToken(); // A
            String left = st.nextToken(); // B
            String right = st.nextToken(); // C

            // 부모 노드가 이미 존재하면 가져오고, 없으면 새로 생성
            Node parentNode = nodeMap.getOrDefault(parent,new Node(parent));
            // 부모 노드를 맵에 추가
            nodeMap.put(parent,parentNode);

            // 왼쪽 자식 노드가 '.'이 아니면 노드를 생성 또는 가져와서 부모 노드에 연결
            if(!left.equals(".")){
                Node leftNode = nodeMap.getOrDefault(left, new Node(left));
                parentNode.left = leftNode;
                nodeMap.put(left, leftNode);
            }

            // 오른쪽 자식 노드가 '.'이 아니면 노드를 생성 또는 가져와서 부모 노드에 연결
            if(!right.equals(".")) {
                Node rightNode = nodeMap.getOrDefault(right, new Node(right));
                parentNode.right = rightNode;
                nodeMap.put(right, rightNode);
            }  
        }

        Node root = nodeMap.get("A");

        preOrder(root);
        System.out.println();
        inOrder(root);
        System.out.println();
        postOrder(root);
        System.out.println();
    }
}

- 코드 설명

public class P1991 {
    static int N;
    static StringTokenizer st;
    static Map<String, Node> nodeMap = new HashMap<>(); // 노드 정보 저장

 

https://devlogofchris.tistory.com/41

 

[JAVA]Map이란? (HashMap, Hashtable, TreeMap)

Map 컬렉션 클래스 Map 인터페이스는 Collection 인터페이스와는 다른 저장 방식을 가집니다. Map 인터페이스를 구현한 Map 컬렉션 클래스들은 키와 값을 하나의 쌍으로 저장하는 방식(key-value 방식)을

devlogofchris.tistory.com

// 부모 노드가 이미 존재하면 가져오고, 없으면 새로 생성
Node parentNode = nodeMap.getOrDefault(parent,new Node(parent));

...

// 왼쪽 자식 노드가 '.'이 아니면 노드를 생성 또는 가져와서 부모 노드에 연결
            if(!left.equals(".")){
                Node leftNode = nodeMap.getOrDefault(left, new Node(left));
                
...

 // 오른쪽 자식 노드가 '.'이 아니면 노드를 생성 또는 가져와서 부모 노드에 연결
            if(!right.equals(".")) {
                Node rightNode = nodeMap.getOrDefault(right, new Node(right));

https://gymdev.tistory.com/39 

 

[java] Map - getOrDefault() 사용법

Map 에서 key 값으로 value 값을 취득하는 경우 get() 메소드를 사용한다. 이때, Map 에서 key 가 존재하면 해당하는 key 의 value 값을 반환하고, 찾는 key 가 없거나 null 이면 null 을 반환한다. ■ get() 1. 예

gymdev.tistory.com

ex) 예시로 설명

A B C
B D .
C . F
String parent = "A";
String left = "B";
String right = "C";

Node parentNode = nodeMap.getOrDefault(parent, new Node(parent));
nodeMap.put(parent, parentNode);

if (!left.equals(".")) {
    Node leftNode = nodeMap.getOrDefault(left, new Node(left));
    parentNode.left = leftNode;
    nodeMap.put(left, leftNode);
}

if (!right.equals(".")) {
    Node rightNode = nodeMap.getOrDefault(right, new Node(right));
    parentNode.right = rightNode;
    nodeMap.put(right, rightNode);
}

 

- parent가 "A"인 노드를 찾고, 없으면 새로운 노드를 생성합니다. 이후 nodeMap에 추가합니다.
- 왼쪽 자식 "B"와 오른쪽 자식 "C"도 같은 방식으로 처리하여 트리 구조를 만듭니다.

 

String parent = "B";
String left = "D";
String right = ".";

Node parentNode = nodeMap.getOrDefault(parent, new Node(parent));
nodeMap.put(parent, parentNode);

if (!left.equals(".")) {
    Node leftNode = nodeMap.getOrDefault(left, new Node(left));
    parentNode.left = leftNode;
    nodeMap.put(left, leftNode);
}

if (!right.equals(".")) {
    Node rightNode = nodeMap.getOrDefault(right, new Node(right));
    parentNode.right = rightNode;
    nodeMap.put(right, rightNode);
}

 

- "B" 노드는 이미 nodeMap에 존재하므로, 기존의 노드를 가져옵니다.
- "D" 노드가 없으면 새로 생성하여 "B"의 왼쪽 자식으로 연결합니다.

String parent = "C";
String left = ".";
String right = "F";

Node parentNode = nodeMap.getOrDefault(parent, new Node(parent));
nodeMap.put(parent, parentNode);

if (!left.equals(".")) {
    Node leftNode = nodeMap.getOrDefault(left, new Node(left));
    parentNode.left = leftNode;
    nodeMap.put(left, leftNode);
}

if (!right.equals(".")) {
    Node rightNode = nodeMap.getOrDefault(right, new Node(right));
    parentNode.right = rightNode;
    nodeMap.put(right, rightNode);
}

- "C" 노드가 이미 nodeMap에 존재하므로, 기존의 노드를 가져옵니다.
- "F" 노드가 없으면 새로 생성하여 "C"의 오른쪽 자식으로 연결합니다.

반응형