루트로 회전시키기

시간 제한1초메모리 제한128 MB

요약
이진 트리에서 각 노드를 한 번씩 루트로 회전시킨 뒤의 트리 높이를 모두 구한다.
난이도

어려움10점 중 8점

유형
트리, DFS, 동적 계획법, 재귀
정답자
아직 제출이 없습니다

문제

루트로 회전(rotate-to-root)은 이진 탐색 트리의 균형을 맞추기 위한 휴리스틱이다. 이 문제에서 노드에 저장된 값은 중요하지 않으며, 휴리스틱이 트리의 모양을 어떻게 바꾸는지에만 관심을 둔다.

이진 트리는 비어 있거나, 왼쪽 자식과 오른쪽 자식을 가지는 하나의 노드로 이루어지며 각 자식도 다시 이진 트리이다. 어떤 노드도 부모를 둘 이상 가지지 않고 사이클이 없으므로, 비어 있지 않은 트리에는 부모가 없는 노드가 정확히 하나 있으며 이를 루트라고 한다.

이 휴리스틱은 어떤 노드 XX가 접근될 때 작동한다. XX가 루트가 아닌 동안 다음 과정을 반복한다.

  • XX가 부모 PP의 왼쪽 자식이면 오른쪽 회전을 수행한다. XX의 오른쪽 자식을 BB라 하자. XX가 PP의 자리를 대신하고(따라서 PP에게 원래 부모가 있었다면 그 부모가 XX의 부모가 된다), PP는 XX의 오른쪽 자식이 되며, BB는 PP의 왼쪽 자식이 된다. XX의 왼쪽 자식과 PP의 오른쪽 자식은 바뀌지 않는다.
  • XX가 부모 PP의 오른쪽 자식이면 왼쪽 회전을 수행한다. XX의 왼쪽 자식을 BB라 하자. XX가 PP의 자리를 대신하고, PP는 XX의 왼쪽 자식이 되며, BB는 PP의 오른쪽 자식이 된다. XX의 오른쪽 자식과 PP의 왼쪽 자식은 바뀌지 않는다.

각 회전은 노드들의 중위 순서를 유지하면서 XX를 루트 쪽으로 한 단계 올린다. 충분히 반복하면 XX가 루트가 된다.

이진 트리의 높이는 루트에서 잎까지의 경로 중 가장 긴 경로에 있는 노드의 개수이다. 형식적으로, 빈 트리의 높이는 00이고, 루트의 두 부분트리가 AA, BB인 비어 있지 않은 트리의 높이는 1+max⁡(height(A),height(B))1 + \max(\mathrm{height}(A), \mathrm{height}(B))이다.

이진 트리가 주어질 때, 각 노드 XX에 대해 XX를 루트로 회전시킨 뒤 트리의 높이가 얼마가 되는지 구하여라.

입력

입력은 여러 개의 테스트 케이스로 이루어진다. 각 테스트 케이스의 첫 줄에는 노드의 개수 NN이 주어지며, 1≤N≤1051 \le N \le 10^5이다.

이어지는 NN개의 줄에는 각각 두 정수가 주어진다. ii번째 줄은 노드 ii의 왼쪽 자식 lil_i와 오른쪽 자식 rir_i이다. 값이 00이면 해당 자식은 빈 트리이고, 그렇지 않으면 1≤li,ri≤N1 \le l_i, r_i \le N이다. 입력은 항상 올바른 이진 트리를 나타낸다.

마지막 테스트 케이스 다음에는 정수 00 하나만 있는 줄이 주어진다. 이 줄은 입력의 끝을 나타내며 처리하지 않는다.

출력

각 테스트 케이스마다 NN개의 줄을 출력한다. ii번째 줄에는 노드 ii를 루트로 회전시킨 뒤 트리의 높이를 출력한다.

예제3

  1. 예제 1

    입력
    4
    2 3
    4 0
    0 0
    0 0
    0
    
    예상 출력
    3
    3
    4
    3
    
  2. 예제 2

    입력
    1
    0 0
    0
    
    예상 출력
    1
    
  3. 예제 3

    입력
    7
    2 3
    4 5
    6 7
    0 0
    0 0
    0 0
    0 0
    0
    
    예상 출력
    3
    4
    4
    4
    4
    4
    4