[백준 2250]

해리·2021년 9월 12일
# -*- coding: utf-8 -*-
"""
Created on Sun Sep 12 18:35:33 2021

@author: 82103
"""
class Node:
    def __init__(self, data, left_node, right_node):
        self.data = data
        self.left_node = left_node
        self.right_node = right_node

# 중위 순회 (Inorder Traversal) : 왼쪽 노드 -> 루트 -> 오른쪽 노드
def in_order(node, depth, a): # depth : 깊이
    if node.left_node != None:
        x = int(node.left_node) # 왼쪽 노드
        dep[x] = depth
        in_order(tree[node.left_node], depth+1, a)
    
    x = int(node.data) # 자기 자신
    dep[x] = depth
    a.append(x)

    if node.right_node != None:
        x = int(node.right_node) # 왼쪽 노드
        in_order(tree[node.right_node], depth+1, a)
    
    return a

n = int(input()) # 노드의 개수
tree = {} # dictionary 형태로 저장

for i in range(n):
    data, left_node, right_node = input().split() # 노드, 왼쪽 자식, 오른쪽 자식
    if left_node == "-1":
        left_node = None
    if right_node == "-1":
        right_node = None
    tree[data] = Node(data, left_node, right_node)

dep = [0]*(n+1) # 노드 i의 깊이
dep[1] = 1
order_list = in_order(tree['1'], 1, [])

o = [0]*(n+1) # 노드 i의 순서

for i in range(n):
    y = order_list[i]
    o[y] = i+1
    i += 1

level = 1 # 너비가 가장 넓은 깊이
ran = 0 # 너비

if n > 1 :
    for i in range(1, n+1): # 노드 1부터 노드 n까지
        for j in range(i+1, n+1): # 노드 1부터 노드 n까지
            if dep[i] == dep[j]:
                tmp = o[j] - o[i] + 1
                if tmp > ran:
                    level = dep[i]
                    ran = tmp
                
print(level, ran)
profile
점의 연결

0개의 댓글