λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Algorithm πŸ§‘πŸ»‍πŸ’»/λ°±μ€€(BOJ)

[λ°±μ€€,c++] 22856번 - 트리 순회

by μ•ˆμ£Όν˜• 2022. 9. 18.

문제

 

22856번: 트리 순회

λ…Έλ“œκ°€ $N$개인 이진 νŠΈλ¦¬κ°€ μžˆλ‹€. 트리λ₯Ό μ€‘μœ„ μˆœνšŒμ™€ μœ μ‚¬ν•˜κ²Œ μˆœνšŒν•˜λ €κ³  ν•œλ‹€. 이λ₯Ό μœ μ‚¬ μ€‘μœ„ 순회라고 ν•˜μž. 순회의 μ‹œμž‘μ€ 트리의 루트이고 순회의 끝은 μ€‘μœ„ μˆœνšŒν•  λ•Œ λ§ˆμ§€λ§‰ λ…Έλ“œμ΄λ‹€.

www.acmicpc.net

 

μ½”λ“œ

#include <iostream>
#include <vector>
using namespace std;

vector<int> graph[100001];
bool visited[1000001];
int end_node;
int ans = 0;
bool flag = true;
void go(int node){

    int left_node = graph[node][0];     // λ…Έλ“œμ™Έ 쒌츑 μžμ‹
    int right_node = graph[node][1];    // λ…Έλ“œμ˜ 우츑 μžμ‹
    
    if(left_node != -1){
        ans+=1;
        go(left_node);
        if(flag) ans+=1;
    }
    if(right_node != -1){
        ans+=1;
        go(right_node);
        if(flag) ans+=1;
    }
    if(node == end_node){
        flag = false;
        return;
    }
}

void inorder(int node){
    int left_node = graph[node][0];
    int right_node = graph[node][1];
    
    if(left_node != -1){
        inorder(left_node);
    }
    end_node = node;
    if(right_node != -1){
        inorder(right_node);
    }
}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    
    int N; cin>>N;
    for(int i=0; i<N; i++){
        int a, b, c; cin>>a>>b>>c;
        graph[a].push_back(b);
        graph[a].push_back(c);
    }
    inorder(1);  // μ€‘μœ„μˆœνšŒμ˜ 끝 λ…Έλ“œλ₯Ό 찾음.
    go(1);   // μœ μ‚¬ μ€‘μœ„μˆœνšŒ 탐색
    cout<<ans;
}

 

풀이

 

트리

문제 μ˜ˆμ‹œ νŠΈλ¦¬μž…λ‹ˆλ‹€. 트리의 μ€‘μœ„ 순회 μˆœμ„œλŠ” Left -> Root -> Right μž…λ‹ˆλ‹€. 트리의 순회 μˆœμ„œλ₯Ό μ •λ¦¬ν•œ 글은 μ•„λž˜μ— μžˆμŠ΅λ‹ˆλ‹€.

 

μ΄μ§„νŠΈλ¦¬ 탐색 μš΄ν–‰λ²•

μ΄μ§„νŠΈλ¦¬(Binary Tree) λΆ€λͺ¨μ™€ μžμ‹μœΌλ‘œ λ‚˜λ‰˜μ–΄ μžˆλŠ” 트리 κ·Έλž˜ν”„ λ…Έλ“œμ˜ μ΅œλŒ€ μ°¨μˆ˜κ°€ 2이며, 각각 μ™Όμͺ½ μžμ‹(left child), 와 였λ₯Έμͺ½ μžμ‹(right child)으둜 λ‚˜λ‰©λ‹ˆλ‹€. μ΄μ§„νŠΈλ¦¬μ˜ 순회 μ΄μ§„νŠΈλ¦¬μ˜ μˆœνšŒμ—

dkswnkk.tistory.com

μœ„ 트리λ₯Ό μ€‘μœ„ μˆœνšŒν•˜κ²Œ 되면 4 -> 2 -> 5 -> 1 -> 6 -> 3 -> 7μž…λ‹ˆλ‹€. μ΄λ•Œ μ€‘μœ„ 순회의 끝은 7이며, 문제의 μœ μ‚¬ μ€‘μœ„ 순회의 끝은 μ€‘μœ„ 순회의 끝 λ…Έλ“œμΈ 7이 λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.

μœ μ‚¬ μ€‘μœ„μˆœνšŒ

μœ„ μ΄λ―Έμ§€λŠ” λ¬Έμ œμ—μ„œ μš”κ΅¬ν•˜λŠ” μœ μ‚¬ μ€‘μœ„μˆœνšŒμ˜ 탐색 μˆœμ„œμž…λ‹ˆλ‹€.

루트인 λ…Έλ“œ 1μ—μ„œ μ‹œμž‘ν•΄μ„œ μ€‘μœ„μˆœνšŒμ˜ 끝 λ…Έλ“œμΈ 7μ—μ„œ λλ‚˜λ©° 1 -> 2 -> 4 -> 5 -> 2 -> 1 -> 3 -> 6 -> 3 -> 7κ³Ό 같은 μˆœμ„œλ‘œ 순회λ₯Ό ν•©λ‹ˆλ‹€.

λ”°λΌμ„œ 문제 풀이 μ•„μ΄λ””μ–΄λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  1. μ€‘μœ„ 순회λ₯Ό ν•˜μ—¬ μ€‘μœ„ 순회의 끝 λ…Έλ“œλ₯Ό μ°ΎλŠ”λ‹€.
  2. μ€‘μœ„ 순회λ₯Ό μ‹œμž‘ν•˜μ—¬ 각 λ…Έλ“œλ₯Ό 탐색할 λ•Œλ§ˆλ‹€ λ°©λ¬Έ 횟수λ₯Ό + 1 μΆ”κ°€ν•˜κ³ , 왕볡이기 λ•Œλ¬Έμ— νƒμƒ‰ν•˜κ³  λ‚˜μ™”μ„ λ•Œλ„ λ°©λ¬Έ 횟수λ₯Ό +1 ν•΄μ€€λ‹€.
  3. λ§Œμ•½ λ°©λ¬Έ λ…Έλ“œκ°€ μ€‘μœ„μˆœνšŒμ˜ 끝 λ…Έλ“œλΌλ©΄, μ™•λ³΅κΉŒμ§€ ν•˜μ§€ μ•Šκ³  ν•΄λ‹Ή λ…Έλ“œμ—μ„œ λλ‚˜κΈ° λ•Œλ¬Έμ— bool λ³€μˆ˜λ₯Ό λ”°λ‘œ μ²΄ν¬ν•˜μ—¬ λ°©λ¬Έ 횟수λ₯Ό ν•œ 번만 ν•˜κ³  μ’…λ£Œν•˜λ„λ‘ ν•œλ‹€.

λŒ“κΈ€