반응형

https://www.acmicpc.net/problem/2250

 

2250번: 트리의 높이와 너비

첫째 줄에 노드의 개수를 나타내는 정수 N(1 ≤ N ≤ 10,000)이 주어진다. 다음 N개의 줄에는 각 줄마다 노드 번호와 해당 노드의 왼쪽 자식 노드와 오른쪽 자식 노드의 번호가 순서대로 주어진다.

www.acmicpc.net

 

먼저, 입력받은 트리의 루트를 구해줍니다.

그 후, 각 노드를 중위순회로 방문하는 순서가 각 노드의 열번호가 됩니다.

이를 통해 열번호의 최저값과 최고값을 기억해준 뒤, 각 레벨 별로 트리의 너비를 구해줍니다.

 

#include <iostream>
#include <algorithm>
#define INF 2147483647
using namespace std;

pair<int, int> tree[10001];
int parent[10001] = { 0 };
int l[10001], r[10001];
int n, a, b, c, idx = 1;

int getParent(int node) {
	if (parent[node] == 0) return node;
	else return getParent(parent[node]);
}

int inorder(int node, int level) {
	if (node == -1) return level - 1;
	int ret = level;
	ret = max(ret, inorder(tree[node].first, level + 1));
	l[level] = min(idx, l[level]);
	r[level] = max(idx++, r[level]);
	ret = max(ret, inorder(tree[node].second, level + 1));
	return ret;
}

int main() {
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) {
		scanf("%d %d %d", &a, &b, &c);
		tree[a] = { b, c };
		if (b != -1) parent[b] = a;
		if (c != -1) parent[c] = a;
		l[i] = INF;
		r[i] = 0;
	}
	int root = getParent(1);
	int maxLevel = inorder(root, 1);
	int width = 0, level = 1;
	for (int i = 1; i <= maxLevel; i++) {
		int w = r[i] - l[i];
		if (w > width) {
			width = w;
			level = i;
		}
	}
	printf("%d %d", level, width + 1);
}
반응형

'Algorithm' 카테고리의 다른 글

백준 17090 : 미로 탈출하기  (0) 2021.11.17
백준 1374 : 강의실  (0) 2021.11.17
백준 2533 : 사회망 서비스(SNS)  (0) 2021.11.17
백준 2800 : 괄호 제거  (0) 2021.11.17
백준 19238 : 스타트 택시  (0) 2021.11.17

+ Recent posts