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);
}
}
To embed this project on your website, copy the following code and paste it into your website's HTML: