728x90
https://www.acmicpc.net/problem/5639
5639번: 이진 검색 트리
트리를 전위 순회한 결과가 주어진다. 노드에 들어있는 키의 값은 106보다 작은 양의 정수이다. 모든 값은 한 줄에 하나씩 주어지며, 노드의 수는 10,000개 이하이다. 같은 키를 가지는 노드는 없다
www.acmicpc.net
풀이)
풀이1
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main_BJ_5639_이진검색트리 {
static class Node{
int num;
Node left, right;
public Node(int num) {
this.num = num;
}
public Node(int num, Node left, Node right) {
this.num = num;
this.left = left;
this.right = right;
}
void insert(int n){
if(n < this.num){
if(this.left == null)
this.left = new Node(n);
else this.left.insert(n);
}
else{
if(this.right == null)
this.right = new Node(n);
else this.right.insert(n);
}
}//insert
}
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Node root = new Node(Integer.parseInt(br.readLine()));
while(true){
String str = br.readLine();
if(str == null || str.equals(""))
break;
int node = Integer.parseInt(str);
root.insert(node);
}
postorder(root);
}//main
private static void postorder(Node node){
if(node == null)
return;
postorder(node.left);
postorder(node.right);
System.out.println(node.num);
}//postorder
}
첫 번째는 Node 클래스를 선언해서 순서대로 담고, postorder 순으로 출력하기!!
가장 흔히 생각할 수 있는 방법이다.
풀이2)
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
public class Main_BJ_5639_이진검색트리2 {
static ArrayList<Integer> tree;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
tree = new ArrayList<>();
while(true){
String str = br.readLine();
if(str == null || str.equals(""))
break;
tree.add(Integer.parseInt(str));
}
postorder(0, tree.size()-1);
}//main
private static void postorder(int index, int end){
if(index > end)
return;
int mid = index+1;
while(mid<=end && tree.get(mid) < tree.get(index))
mid++;
postorder(index+1, mid-1);
postorder(mid, end);
System.out.println(tree.get(index));
}//postorder
}
/*
50
30
24
5
28
45
98
52
60
index: 0 end: 8 mid: 6
index: 1 end: 5 mid: 5 (left)
index: 2 end: 4 mid: 4 (left)
index: 3 end: 3 mid: 4 (left)
index: 4 end: 3 (left)
index: 4 end: 3 (right)
print tree(index) = 5
index: 4 end: 4 mid: 5 (right)
index: 5 end: 4 (left)
index: 5 end: 4 (right)
print tree(index) = 28
print tree(index) = 24
index: 6 end: 5 (left)
print tree(index) = 45
...
*/
ArrayList 또는 배열에 차례대로 담고, subtree를 구분하기 위해 중간 지점을 찾아가며 postorder 순으로 출력!
왼쪽 subtree, 오른쪽 subtree 순으로 찾고, 본인을 출력하면 된다.
- 깨달은 점
- 입력이 어느정도인지 정해지지 않은 경우 null이나 ""과 같을 경우를 사용하면 된다.
- Scanner는 hasNext()를 사용하면 된다
- 잘 못했던 점
- 트리를 탐색할 때 중간 지점을 찾아 subtree를 재귀로 탐색하는 방법 -> 헷갈려서 일일히 디버깅하면서 쳐봄..ㅠ
막상 풀어보니 별거 아닌것 같은데 헷갈렸던 문제였다.
다시 풀어봐야지!
참고한 블로그
https://girawhale.tistory.com/59
[백준] 5639번: 이진 검색 트리 - JAVA
🔗 문제 링크 BOJ 5639번: 이진 검색 트리 1️⃣ 트리 직접 그리기 📝 풀이 과정 전위 순회의 경우 처음 탐색한 값이 항상 root이기 때문에 먼저 처음 값을 root로 설정해 주었다. 이후 반복문을 돌며
girawhale.tistory.com
728x90
'코테 > 백준' 카테고리의 다른 글
백준 15654 N과 M(5) (JAVA) (0) | 2023.03.04 |
---|---|
백준 15652 N과 M(4) (JAVA) (0) | 2023.03.03 |
백준 15650 N과 M(2) (JAVA) (0) | 2023.03.02 |
백준 2609 최대공약수와 최소공배수(JAVA) (0) | 2023.03.02 |
백준 1735 최단 경로(JAVA) (0) | 2023.02.23 |