import java.util.*;
import java.lang.*;
import java.io.*;


class Main {
    static class Node {
        int value;
        Node left, right;
        
        Node(int value) {
            this.value = value; 
            this.left = null;
            this.right = null;
        }
    }
    
    static int N;
    static void preOrder(Node node){
        if (node == null) return;
        System.out.println(node.value);
        preOrder(node.left);
        preOrder(node.right);
    }

    // 처음에 void로 했는데 왜 Node를 반환해야 하는가?
    // 아래의 root 초반설정을 왜 하려하는가?
    
    static Node insert(Node node, int value){
        // Exception in thread "main" java.lang.NullPointerException: Cannot assign field "value" because "<parameter1>" is null
        // 이 에러가 뜨는데.. null이여도 받을 수 있는 조치를 취해야하나? 이게 null이여야 객체를 생성하는 로직이니 파라미터를 null로 받긴 해야할 듯 한데
        if(node == null) {
            
            return new Node(value);
        } else {
            Node left = node.left;
            Node right = node.right;
            
            if(value < node.value) {
                node.left = insert(left, value);
                // insert의 반환값이 있고, 이게 left여야 함. node.left로 값을 받은 이유는 Node left에 값을 할당하면 아래 반환 node에 적용 안되니까
            }
            
            if(value > node.value) {
                node.right = insert(right, value);
            }
            
            return node;
            //위의 왜 Node를 반환해야하냐는 질문에 대한 답: 위 왼쪽/오른쪽 insert작업 적용한 left,right 갱신용이라 해야하나?
            //결국 insert작업을 한 이유는 새 노드를 파고 연결시키기 위함?(내가 말해놓고 잘 모르겠네...)
            // insert작업은 노드를 확인하고 값이 없으면 자기 자신의 value 대입, 있으면 하위 노드에 좌/우 선택하고 null이면 new Node가 올 것이고
            // null이 없다면 좌, 우에 값을 넣어 적용시킨 노드를 반환하는데 2라는 노드 아래 1을 넣으면 왼쪽으로 가고, 이게 2의 왼쪽 노드로 들어가고
            // 이 노드가 반환되는데 이게 어디에서 쓰이냐하면 대체 어디 쓰이지....? 이게 내가 모르는 부분인가? 
            // 루트의 왼쪽에2, 오른쪽에6이 있다고 가정하면 node.left = 2 , node.right = 6이 들어가고 이 상태로 node가 반환됨. 음... 이 반환 node는 최종족으로 node가 아닌 트리 그 자체가 되는건가?
            // 위의 모든 트리작업을 끝마치고 루트노드 하나를 반환(모든 트리구조가 포함된) 이게 결론이 될 듯 한데.
        }
    }

    
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(br.readLine());
        StringTokenizer st = new StringTokenizer(br.readLine());
        Node root = null;
        for (int i=0; i<N; i++){
            int value = Integer.parseInt(st.nextToken()); 
            root = insert(root, value);
            // 이 코드 보면 내 가정이 맞는 듯 한데? 
            // root노드를 두고 이 루트를 계속 갱신해. 넣으면 넣을수록 루트는 그대로일지언정 하위트리가 계속 갱신될 듯. 
        }

        preOrder(root);
    }
}

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: