2250번: 트리의 높이와 너비
첫째 줄에 노드의 개수를 나타내는 정수 N(1 ≤ N ≤ 10,000)이 주어진다. 다음 N개의 줄에는 각 줄마다 노드 번호와 해당 노드의 왼쪽 자식 노드와 오른쪽 자식 노드의 번호가 순서대로 주어진다.
www.acmicpc.net
#include <iostream>
#include <algorithm>
#define left _left
#define right _right
using namespace std;
struct Node {
int left, right;
int order, depth;
};
Node a[10001];
int left[10001];
int right[10001];
int cnt[10001];
int order = 0;
void inorder(int node, int depth) {
if (node == -1) return;
inorder(a[node].left, depth+1);
a[node].order = ++order;
a[node].depth = depth;
inorder(a[node].right, depth+1);
}
int main() {
int n;
cin >> n;
for (int i=0; i<n; i++) {
int x, y, z;
cin >> x >> y >> z;
a[x].left = y;
a[x].right = z;
if (y != -1) cnt[y] += 1;
if (z != -1) cnt[z] += 1;
}
int root = 0;
for (int i=1; i<=n; i++) {
if (cnt[i] == 0) {
root = i;
}
}
inorder(root, 1);
int maxdepth = 0;
for (int i=1; i<=n; i++) {
int depth = a[i].depth;
int order = a[i].order;
if (left[depth] == 0) {
left[depth] = order;
} else {
left[depth] = min(left[depth], order);
}
right[depth] = max(right[depth], order);
maxdepth = max(maxdepth, depth);
}
int ans = 0;
int ans_level = 0;
for (int i=1; i<=maxdepth; i++) {
if (ans < right[i]-left[i]+1) {
ans = right[i]-left[i]+1;
ans_level = i;
}
}
cout << ans_level << ' ' << ans << '\n';
return 0;
}
'Problem set' 카테고리의 다른 글
[백준] 1167 트리의 지름 (0) | 2021.02.20 |
---|---|
[백준] 11725 트리의 부모 찾기 (0) | 2021.02.20 |
[백준] 1991 트리 순회 (0) | 2021.02.20 |
[백준] 1261 알고스팟 (0) | 2021.02.20 |
[백준] 13549 숨박꼭질 3 (0) | 2021.02.20 |