개념
루트를 기준으로 탐색하기
트리에서 루트를 정하면 각 정점의 부모와 깊이를 구할 수 있습니다. 루트의 깊이는 이며 자식의 깊이는 부모의 깊이보다 큽니다. 무방향 간선으로 저장한 트리를 탐색할 때는 직전에 방문한 부모를 제외하고 자식으로 이동합니다.
트리는 두 정점 사이의 경로가 하나입니다. 부모 방향으로 되돌아가는 간선을 제외하면 이미 방문한 다른 정점으로 돌아가는 간선이 있을 수 없습니다. 그런 간선이 있다면 사이클이 생겨 트리가 아니기 때문입니다. 이 성질 덕분에 트리 탐색에서는 부모를 구분하는 것으로 중복 방문을 막을 수 있습니다.
전위·후위·중위 순회
전위 순회는 현재 정점을 처리한 뒤 자식을 탐색합니다. 부모의 정보로 자식의 깊이나 누적 거리를 계산할 때 사용합니다.
후위 순회는 자식을 모두 탐색한 뒤 현재 정점을 처리합니다. 자식의 계산 결과를 모아 서브트리 크기 등을 구할 때 사용합니다.
중위 순회는 이진 트리에서 왼쪽 서브트리, 현재 정점, 오른쪽 서브트리 순서로 처리합니다. 이진 탐색 트리를 중위 순회하면 키를 정렬된 순서로 얻습니다.
서브트리 크기
정점 를 루트로 하는 서브트리의 크기는 자기 자신 한 개와 각 자식의 서브트리 크기를 더한 값입니다.
리프의 크기는 입니다. 자식의 크기를 먼저 계산해야 하므로 후위 순서로 합칩니다.
어떤 정점의 두 자식에 속한 서브트리 크기가 각각 , 이라면, 두 서브트리는 서로 겹치지 않으므로 자신까지 포함해 입니다. 자식의 크기를 알아야 부모의 크기를 구할 수 있으므로 후위 순서가 필요합니다. 반대로 깊이는 부모의 깊이를 알아야 하므로 부모를 먼저 처리합니다. 계산에 필요한 정보가 어느 방향에서 오는지에 따라 순회 순서를 정합니다.
이진 탐색 트리의 중위 순회가 정렬 결과를 만드는 이유도 처리 순서에 있습니다. 왼쪽의 작은 키들을 먼저 읽고, 현재 키를 읽은 다음, 오른쪽의 큰 키들을 읽기 때문입니다.
복잡도
정점 수를 이라고 합니다.
| 연산 | 시간복잡도 | 공간복잡도 |
|---|---|---|
| 부모·깊이·서브트리 크기 계산 | 그래프·정보·재귀 |
예제
문제
정점 을 루트로 하는 트리에서 각 정점의 부모, 깊이, 서브트리 크기를 구하여라.
입력
첫째 줄에 정점 수 이 주어진다. 이다.
다음 개 줄에 간선의 양 끝점 가 공백을 사이에 두고 주어진다. 이다.
출력
정점 부터 까지 번호 순서대로 각 정점의 부모 번호, 깊이, 서브트리 크기를 공백을 사이에 두고 한 줄에 출력한다. 루트의 부모 번호와 깊이는 모두 이다.