알고리즘 공부(백준)
[5639] 이진 검색 트리
Leezu_
2021. 3. 24. 16:59
트리 문제를 풀기 위한 기본적인 틀, Node와 Tree 작성을 익히기 위해서 어제에 이어 트리 문제를 한번 더 풀었다. 이 문제에서 어려웠던 점은.. 입력을 마치는 방법이었다. 그건 검색을 통해서 Ctrl + z로 입력을 마칠 수 있다고 찾았다.
Node와 Tree의 기본적인 생성을 마치고,
키 값이 들어오면 root부터 시작해서
작으면 왼쪽, 갈 곳이 없으면 왼쪽 노드로 생성
크면 오른쪽, 갈 곳이 없으면 오른쪽 노드로 생성
이라는 간단한 원리로 문제를 풀 수 있었다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
Tree t = new Tree();
String a;
while((a = br.readLine()) != null) {
t.addNode(t, Integer.valueOf(a));
}
// 후위 순회
t.postOrder(t.root);
}
}
class Node{
int data;
Node left;
Node right;
public Node(int data) {
this.data = data;
}
}
class Tree{
Node root;
public void addNode(Tree t, int data) {
// root 생성
if(t.root == null) {
root = new Node(data);
} else {
// data가 들어갈 자리 찾기
searchNode(t.root, data);
}
}
public void searchNode(Node node, int data) {
// data가 노드의 키값보다 작을 경우
if(data < node.data) {
// 노드의 왼쪽 자식이 있을 경우, 왼쪽 노드로 이동
if(node.left != null)
searchNode(node.left, data);
// 노드의 왼쪽 자식이 없을 경우, data를 왼쪽 자식 노드로
else
node.left = new Node(data);
// data가 노드의 키값보다 클 경우
} else if(data > node.data) {
// 노드의 오른쪽 자식이 있을 경우, 오른쪽 노드로 이동
if(node.right != null)
searchNode(node.right, data);
// 노드의 오른쪽 자식이 없을 경우, data를 오른쪽 자식 노드로
else
node.right = new Node(data);
}
}
public void postOrder(Node node) {
if(node.left != null) {
postOrder(node.left);
}
if(node.right != null) {
postOrder(node.right);
}
System.out.println(node.data);
}
}