본문 바로가기
알고리즘/DFS

2250 트리의 높이와 너비

by tryotto 2020. 1. 22.
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include <stdio.h>
#include <vector>
#include <utility>
#include <queue>
 
using namespace std;
 
vector<vector<int> > heightNd;
vector<pair<intint> > child;
int par[10001= { 0 };
int ndX[10001= { 0 };
int maxWidth = -1 , mostLevel;
 
void levelWidth(int h) {
    for (int i = 1; i <= h; i++) {
        int levelL = 10001, levelR = -1;
        for (int j = 0; j < heightNd[i].size(); j++) {
            int idx = heightNd[i][j];
            int tmpX = ndX[idx];
 
            if (tmpX < levelL)
                levelL = tmpX;
            if (tmpX > levelR)
                levelR = tmpX;
        }
        int tmpWidth = levelR - levelL;
        if (maxWidth < tmpWidth) {
            maxWidth = tmpWidth;
            mostLevel = i;
        }
    }
}
 
int x = 1;
void traverse(int idx) {
    int l = child[idx].first;
    int r = child[idx].second;
 
    if (l != -1
        traverse(l);    
 
    ndX[idx] = x++;
 
    if (r != -1
        traverse(r);    
}
 
int findHeight(int root) {
    queue<pair<intint> > q;
    q.push(make_pair(root, 1));
 
    int h, idx;
    while (!q.empty()) {
        idx = q.front().first;
        h = q.front().second;
        
        q.pop();
        heightNd[h].push_back(idx);
 
        int l = child[idx].first;
        int r = child[idx].second;
 
        if (l != -1)
            q.push(make_pair(l, h + 1));
        if (r != -1)
            q.push(make_pair(r, h + 1));
    }
    return h;
}
 
int main() {
    int n;
    scanf("%d"&n);
 
    child.resize(n + 2);
    heightNd.resize(n + 2);
 
    for (int i = 1; i <= n; i++) {
        int a, b, c;
        scanf("%d %d %d"&a, &b, &c);
 
        child[a].first = b;
        child[a].second = c;
        
        if (b != -1)
            par[b] = a;
        if (c != -1)
            par[c] = a;
    }
    //root 찾기
    int root = -1;
    for (int i = 1; i <= n; i++
        if (par[i] == 0
            root = i;
    //높이 찾기
    int height = findHeight(root);
    //순회하면서 좌표 갱신하기
    traverse(root);
    //각 레벨 당 최대 너비 찾기
    levelWidth(height);
 
    printf("%d %d", mostLevel, maxWidth + 1);
}
cs


1. 중위순회를 통해 x 를 갱신한다
2. 각 레벨별로 최좌측, 최우측 x 좌표를 구한다

>> 이 두 가지를 떠올리는게 쉽지 않아서 다른 블로그를 참조했다
중요!!

아 그리고!
순회를 할때는 무조건 DFS를 사용해야 한다
BFS로는 절대 못품!


'알고리즘 > DFS' 카테고리의 다른 글

(시간초과) 2146 다리만들기  (0) 2020.01.18
14502 연구실  (0) 2020.01.17
4677 Oil Deposit  (0) 2020.01.14
2468 안전영역  (0) 2020.01.14
2798 블랙잭  (0) 2019.09.15