루트로 회전시키기
시간 제한1초메모리 제한128 MB
이진 트리에서 각 노드를 한 번씩 루트로 회전시킨 뒤의 트리 높이를 모두 구한다.
문제
루트로 회전(rotate-to-root)은 이진 탐색 트리의 균형을 맞추기 위한 휴리스틱이다. 이 문제에서 노드에 저장된 값은 중요하지 않으며, 휴리스틱이 트리의 모양을 어떻게 바꾸는지에만 관심을 둔다.
이진 트리는 비어 있거나, 왼쪽 자식과 오른쪽 자식을 가지는 하나의 노드로 이루어지며 각 자식도 다시 이진 트리이다. 어떤 노드도 부모를 둘 이상 가지지 않고 사이클이 없으므로, 비어 있지 않은 트리에는 부모가 없는 노드가 정확히 하나 있으며 이를 루트라고 한다.
이 휴리스틱은 어떤 노드 가 접근될 때 작동한다. 가 루트가 아닌 동안 다음 과정을 반복한다.
- 가 부모 의 왼쪽 자식이면 오른쪽 회전을 수행한다. 의 오른쪽 자식을 라 하자. 가 의 자리를 대신하고(따라서 에게 원래 부모가 있었다면 그 부모가 의 부모가 된다), 는 의 오른쪽 자식이 되며, 는 의 왼쪽 자식이 된다. 의 왼쪽 자식과 의 오른쪽 자식은 바뀌지 않는다.
- 가 부모 의 오른쪽 자식이면 왼쪽 회전을 수행한다. 의 왼쪽 자식을 라 하자. 가 의 자리를 대신하고, 는 의 왼쪽 자식이 되며, 는 의 오른쪽 자식이 된다. 의 오른쪽 자식과 의 왼쪽 자식은 바뀌지 않는다.
각 회전은 노드들의 중위 순서를 유지하면서 를 루트 쪽으로 한 단계 올린다. 충분히 반복하면 가 루트가 된다.
이진 트리의 높이는 루트에서 잎까지의 경로 중 가장 긴 경로에 있는 노드의 개수이다. 형식적으로, 빈 트리의 높이는 이고, 루트의 두 부분트리가 , 인 비어 있지 않은 트리의 높이는 이다.
이진 트리가 주어질 때, 각 노드 에 대해 를 루트로 회전시킨 뒤 트리의 높이가 얼마가 되는지 구하여라.
입력
입력은 여러 개의 테스트 케이스로 이루어진다. 각 테스트 케이스의 첫 줄에는 노드의 개수 이 주어지며, 이다.
이어지는 개의 줄에는 각각 두 정수가 주어진다. 번째 줄은 노드 의 왼쪽 자식 와 오른쪽 자식 이다. 값이 이면 해당 자식은 빈 트리이고, 그렇지 않으면 이다. 입력은 항상 올바른 이진 트리를 나타낸다.
마지막 테스트 케이스 다음에는 정수 하나만 있는 줄이 주어진다. 이 줄은 입력의 끝을 나타내며 처리하지 않는다.
출력
각 테스트 케이스마다 개의 줄을 출력한다. 번째 줄에는 노드 를 루트로 회전시킨 뒤 트리의 높이를 출력한다.