코딩 공부/백준

[백준][C++] 5639 이진 검색 트리

김 정 환 2021. 3. 3. 23:22
반응형

www.acmicpc.net/problem/5639

 

5639번: 이진 검색 트리

트리를 전위 순회한 결과가 주어진다. 노드에 들어있는 키의 값은 106보다 작은 양의 정수이다. 모든 값은 한 줄에 하나씩 주어지며, 노드의 수는 10,000개 이하이다. 같은 키를 가지는 노드는 없다

www.acmicpc.net

 

 

알고리즘 종류

    - 트리

    - 그래프

 

 

 

사고 과정

    - 전위 순회로 이진트리 만드는 방법

        1. 전위 순회는 root를 먼저 출력하고 자식들을 출력하기 때문에 맨 앞에 root가 나오게 된다. 따라서 전위 순회를 순서대로 넣어주면 이진트리를 만들 수 있다.

 

 

 

구현(C++)

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
#include <iostream>
#include <vector>
 
using namespace std;
 
struct Node{
    int data;
    Node *left = NULL;
    Node *right = NULL;
};
 
void make_tree(Node *p, int num){
 
    Node *node = new Node;
    node->data = num;
    Node *tmp;
    
    while(p){
        tmp = p;
        if(p->data < num) p = p->right;
        else p = p->left;
    }
    if(num < tmp->data) tmp->left = node;
    else tmp->right = node;
}
 
 
void post_order(Node *p){
    if(p != NULL){
        post_order(p->left);
        post_order(p->right);
        cout << p->data << '\n';
    }
}
 
 
int main(void){
    ios_base::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    
    Node *root = new Node;
    cin >> root->data;
    
    int num;
    while(cin >> num){
        make_tree(root, num);
    }
    
    post_order(root);
}
cs

    - 배열을 이용한 트리 탐색

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
#include <iostream>
#include <vector>
 
using namespace std;
 
struct Node{
    int left=0;
    int right=0;
};
 
Node tree[1000001];
 
void insert(int p, int data){
    if(p<data){
        if(tree[p].right == 0) tree[p].right = data;
        else insert(tree[p].right, data);
    }
    else {
        if(tree[p].left == 0) tree[p].left = data;
        else insert(tree[p].left, data);
    }
}
 
void post_order(int p){
    
    if(p != 0){
        post_order(tree[p].left);
        post_order(tree[p].right);
        cout << p << "\n";
    }
}
 
int main(void){
    ios_base::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    
    int root;
    cin >> root;
    
    int num;
    while(cin >> num){
        insert(root, num);
    }
    
    post_order(root);
}
 
cs

 

 

시행착오

    - 이진트리 만드는 방법을 배울 수 있었다.

반응형

'코딩 공부 > 백준' 카테고리의 다른 글

[백준][C++] 10993 별 찍기 - 18  (0) 2021.03.12
[백준][C++] 2665 미로만들기  (0) 2021.03.04
[백준][C++] 18808 스티커 붙이기  (0) 2021.03.03
[백준][C++] 12904 A와 B  (0) 2021.03.03
[백준][C++] 2116 주사위 쌓기  (0) 2021.03.02