문제링크 : https://www.acmicpc.net/problem/5639
5639번: 이진 검색 트리
문제 이진 검색 트리는 다음과 같은 세 가지 조건을 만족하는 이진 트리이다. 노드의 왼쪽 서브트리에 있는 모든 노드의 키는 노드의 키보다 작다. 노드의 오른쪽 서브트리에 있는 모든 노드의 키는 노드의 키보다 크다. 왼쪽, 오른쪽 서브트리도 이진 검색 트리이다. 전위 순회 (루트-왼쪽-오른쪽)은 루트를 방문하고, 왼쪽 서브트리, 오른쪽 서브 트리를 순서대로 방문하면서 노드의 키를 출력한다. 후위 순회 (왼쪽-오른쪽-루트)는 왼쪽 서브트리, 오른쪽 서브트리,
www.acmicpc.net
문제를 푸는 핵심은 전위순회를 가지고 어떻게 이진탐색트리를 만드냐 인데 preorder -> 이진탐색트리 생성 방법은 아래와 같다.
예를들어 preorder sequence 가 { 10, 5, 1, 7, 40, 50 } 가 되어 있다면
1. preorder 순서 중 첫번째 키는 항상 이진트리의 루트(root) 노드이기 때문에 루트노드를 생성 한다. (ex. 10 이 루트노드가 된다.)
2. 그 다음에 루트 노드 보다 큰 키값을 가진 첫 번째 요소를의 인덱스 i 를 찾는다. ( ex. 여기서는 40 이 루트노드 10보다 큰 값을 가진 것중 가장 첫번째 요소이다. )
3. 루트노드를 제외한 i 이전 까지의 키들은 왼쪽 서브트리(left subtree)가 되고 ( ex. left subtree ∈ { 5, 1, 7 } )
4. i 를 포함하여 i 이후의 모든 키들은 오른쪽 서브트리(right subtree)가 된다. ( ex. right subtree ∈ {40, 50} )
5. 1-4번을 재귀적으로 반복한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
|
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.function.Consumer;
public class Main {
// Key 값은 비교 가능해야하니 Comparable 를 상속한 클래스이어야 한다.
public static class BinarySearchTree {
public Node root ; // 이진탐색트리의 루트 노드
public class Node {
public int key ; // 노드의 키값이고 이거에 의해 정렬되어 질 것이다.
public Node left ; // 왼쪽 서브트리 노드,
public Node right ; // 오른쪽 서브트리
public Node(int key) {
this.key = key;
}
}
public void postorderTraversal(Node node, Consumer<Node> consumer) {
if(node == null)
return;
// left -> right -> root
postorderTraversal(node.left, consumer);
postorderTraversal(node.right, consumer);
}
public static BinarySearchTree newBSTFromPreOrder(int[] key) {
BinarySearchTree bst = new BinarySearchTree();
return bst;
}
private Node buildNodeFromPreorder(int[] preorder, int start, int end) {
// base case
if (start > end) {
return null;
}
Node node = new Node(preorder[start]);
int i = start;
while(i <= end) {
break;
}
i++;
}
node.right = buildNodeFromPreorder(preorder, i, end);
return node;
}
}
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
List<Integer> list = new ArrayList<>();
while(true) {
String input = bf.readLine();
if(input == null || input.isEmpty())
break;
list.add(Integer.parseInt(input));
}
BinarySearchTree bst = BinarySearchTree.newBSTFromPreOrder(inputs);
}
}
Colored by Color Scripter
|
'코딩테스트(Coding Test) > 백준(Baekjoon OJ)' 카테고리의 다른 글
백준 2947 - 나무조각 (버블정렬) (0) | 2019.07.03 |
---|---|
백준 7785 - 회사에 있는 사람 (0) | 2019.06.28 |
백준 1620 - 나는야 포켓몬 마스터 이다솜 (0) | 2019.06.28 |
백준 1920 - 수 찾기 (0) | 2019.06.27 |
백준 1991 - 트리 순회 (0) | 2019.06.27 |