알고리즘/백준

백준-1991번/트리순회(java)

연향동큰손 2024. 7. 29. 21:31

 

 

문제 이해

 

자바를 통해 트리를 구현하고 전위순회, 중위순회, 후위순회를 구현해 보았다.

파이썬으로는 구현해본 경험이 있지만 자바로는 처음 구현해보아서 약간 생소했다. 

 

이 문제를 풀기 위해서 가장 중요한 것은 노드를 삽입을 구현하는 것이다.

 

문제 해결

 

우선 트리를 구현하기 위해서 Node 클래스를 만들어 준다.

 

필드값

1) data ==> 노드가 가지고 있는 데이터

2) left ==> 왼쪽 자식 노드

3) right ==> 오른쪽 자식 노드

 

static class Node{
   private char data;
   private Node left;
   private Node right;
    Node(char data) {
        this.data = data;
        this.left = null;
        this.right = null;
    }
        public Node(char data, Node left, Node right){
           this.data=data;
            this.left=left;
            this.right=right;
        }

}

 

 

그리고 구현하면서 가장 어려웠던 insertNode 메서드이다.

public static void insertNode(Node tmp, char root, char left, char right){
    if(tmp==null){
        return;
    }
    if(tmp.data==root){
        if(left!='.'){
            tmp.left=new Node(left);
        }
        if(right !='.'){
            tmp.right = new Node(right);
        }
    }
    else{
        insertNode(tmp.left,root,left,right);
        insertNode(tmp.right,root,left,right);
    }
}

루트 노트를 받아서 left와 right 노드를 계속 탐색하면서 내려가서 삽입 할 노드의 부모 노드를 찾으면 left나 right 노드로 넣어준다.

 

<전체 코드>

import java.util.Scanner;

public class Problem1991 {
    static Node head = new Node('A',null,null);

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int N = scanner.nextInt();
        scanner.nextLine();
        for(int i=0; i<N; i++){
                String st = scanner.nextLine();
                insertNode(head,st.charAt(0),st.charAt(2),st.charAt(4));
        }

        preOrder(head);
        System.out.println();
        inOrder(head);
        System.out.println();
        postOrder(head);

    }

    static class Node{
       private char data;
       private Node left;
       private Node right;
        Node(char data) {
            this.data = data;
            this.left = null;
            this.right = null;
        }
            public Node(char data, Node left, Node right){
               this.data=data;
                this.left=left;
                this.right=right;
            }

    }
    public static void preOrder(Node node){
        if(node==null){
            return;
        }
        else{
            System.out.print(node.data);
            preOrder(node.left);
            preOrder(node.right);
        }
    }
    public static void inOrder(Node node){
        if(node==null){
            return;
        }
        else{
            inOrder(node.left);
            System.out.print(node.data);
            inOrder(node.right);
        }
    }

    public static void postOrder(Node node){
        if(node==null){
            return;
        }
        else{
            postOrder(node.left);
            postOrder(node.right);
            System.out.print(node.data);
        }
    }
    public static void insertNode(Node tmp, char root, char left, char right){
        if(tmp==null){
            return;
        }
        if(tmp.data==root){
            if(left!='.'){
                tmp.left=new Node(left);
            }
            if(right !='.'){
                tmp.right = new Node(right);
            }
        }
        else{
            insertNode(tmp.left,root,left,right);
            insertNode(tmp.right,root,left,right);
        }
    }

}