import sys
from collections import defaultdict
def input():
return sys.stdin.readline().rstrip()
def dfs(cur_idx,parent_idx):
global cnt
depth[cur_idx] = depth[parent_idx] + 1
if tree[cur_idx][0] != -1:
dfs(tree[cur_idx][0],cur_idx)
cnt += 1
width[depth[cur_idx]].append(cnt)
if tree[cur_idx][1] != -1:
dfs(tree[cur_idx][1],cur_idx)
N = int(input())
root_check = [0 for _ in range(N+1)]
tree = [[-1 -1] for _ in range(N+1)]
depth = [0 for _ in range(N+1)]
width = defaultdict(list)
for _ in range(N):
x,left_node,right_node = map(int,input().split())
tree[x] = [left_node,right_node]
if left_node != -1:
root_check[left_node] += 1
if right_node != -1:
root_check[right_node] += 1
root_num = -1
for k in range(1,N+1):
if root_check[k] == 0:
root_num = k
break
cnt = 0
dfs(root_num,0)
max_value = 0
max_depth = -1
for d in range(1,max(depth)+1):
max_width,min_width = max(width[d]),min(width[d])
if max_value < max_width - min_width + 1:
max_value = max_width - min_width + 1
max_depth = d
print(max_depth,max_value)
이 문제를 풀때 주의할점은 2가지이다.
루트노드가 꼭 1인것은 아니다.
들어오는 순서가 1,2,3,4,5,6,7,8,....N이 아닐수도 있다.
이 2가지를 주의하면 풀면 되는 문제이다.
먼저 트리를 위한 (N+1)*2의 배열을 만들어뒀다.
각 행의 0번인덱스는 왼쪽 자식, 1번인덱스는 오른쪽자식을 의미한다.
이 문제는 중위순회를 구현을 해서, 왼쪽 자식->루트->오른쪽자식 순서로 탐색을 해준다.
그리고 루트일때 현재의 LEVEL에 width를 저장을 해주엇다.
cnt를 0부터 시작했기때문에, append 하기 직전에 +=1 을 해준것이다.
만약 1부터 하신분들은 순서를 바꾸면될것이다.
그리고 전체 레벨 만큼 탐색을하면서 최대 너비를 구해주면 되는 문제이다.
좀 더 깔끔히 하신분들은 level별로 2차원배열을 만든뒤에 둘 중 하나는 최대값 하나는 최소값을 저장을 시켜서
마지막에 바로 계산이 가능하게 한 분들도 계신다.
'알고리즘 > 백준' 카테고리의 다른 글
[BOJ/백준] 1398 동전 (0) | 2021.06.29 |
---|---|
[BOJ/백준] 1045 도로 (0) | 2021.06.29 |
[BOJ/백준] 2213 트리의 독립집합 (0) | 2021.06.22 |
[BOJ/백준] 1414 불우이웃 돕기 (0) | 2021.06.22 |
[BOJ/백준] 1799 비숍 (0) | 2021.06.18 |