짱아의 개발 기록장

백준 2250번. 트리의 높이와 너비(c++) / Tree 본문

Algorithm/Baekjoon

백준 2250번. 트리의 높이와 너비(c++) / Tree

jungahshin 2021. 3. 2. 18:52
반응형

전형적인 Tree문제이다.

InorderTraversal(중위순회)을 통해서 col값을 ++해주고

dfs를 통해서 인자값으로 넘긴 level을 기준으로 height[level]값에 해당 col값을 차례대로 넣어주었다.

이후에는 1~maxHeight값을 탐색하며 level별로 너비를 구해주며, 최대 너비를 구했다.

 

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
// 트리의 높이와 너비
#include <iostream>
#include <algorithm>
#include <vector>
 
using namespace std;
 
pair<intint> tree[10001];
int n, m, a, b, root;
int cnt[10001= {0, };
int idx = 0, maxHeight = 0;
vector<int> height[10001];
 
bool cmp(const pair<intint> &a, const pair<intint> &b){
    if(a.first==b.first){
        return a.second<b.second;
    }
 
    return a.first>b.first;
}
 
void InorderTraversal(int node, int level){
    if(node==-1){
        return;
    }
    maxHeight = max(maxHeight, level);
    InorderTraversal(tree[node].first, level+1);
    height[level].push_back(idx++);
    InorderTraversal(tree[node].second, level+1);
}
 
int main()
{
    cin>>n;
    for(int i=1; i<=n; i++){
        cin>>m>>a>>b;
        tree[m] = make_pair(a, b);
        cnt[m]++;
        cnt[a]++;
        cnt[b]++;
    }
 
    for(int i=1; i<=n; i++){
        if(cnt[i]==1){
            root = i;
            break;
        }
    }
 
    InorderTraversal(root, 1);
 
    vector<pair<intint>> temp;
    for(int i=1; i<=maxHeight; i++){
        int width = height[i][height[i].size()-1]-height[i][0]+1;
        temp.push_back(make_pair(width, i));
    }
    sort(temp.begin(), temp.end(), cmp);
 
    cout<<temp[0].second<<" "<<temp[0].first<<"\n";
    return 0;
}
cs
반응형
Comments