우리는 포스트 순서로 깊이 우선 검색을 수행하고 도중에 결과를 집계합니다. 즉, 문제를 재귀 적으로 해결합니다.
검색 트리에서 하위 모든 노드 에 대해 두 가지 경우가 있습니다.vu1,…,uk
- 에서 가장 긴 경로 는 서브 트리 중 하나에 있습니다 .TvTu1,…,Tuk
- 에서 가장 긴 경로 는 포함 합니다.Tvv
두 번째 경우, 에서 하나의 가장 긴 경로를 에서 하위 트리 중 하나로 결합해야합니다 . 이것들은 확실히 가장 깊은 잎에있는 것들입니다. 경로의 길이는 인 경우 이고 인 경우 이고 하위 트리 높이의 다중 세트 ¹.vH(k)+H(k−1)+2k>1H(k)+1k=1H={h(Tui)∣i=1,…,k}
의사 코드에서 알고리즘은 다음과 같습니다.
procedure longestPathLength(T : Tree) = helper(T)[2]
/* Recursive helper function that returns (h,p)
* where h is the height of T and p the length
* of the longest path of T (its diameter) */
procedure helper(T : Tree) : (int, int) = {
if ( T.children.isEmpty ) {
return (0,0)
}
else {
// Calculate heights and longest path lengths of children
recursive = T.children.map { c => helper(c) }
heights = recursive.map { p => p[1] }
paths = recursive.map { p => p[2] }
// Find the two largest subtree heights
height1 = heights.max
if (heights.length == 1) {
height2 = -1
} else {
height2 = (heights.remove(height1)).max
}
// Determine length of longest path (see above)
longest = max(paths.max, height1 + height2 + 2)
return (height1 + 1, longest)
}
}
- A(k) 는 (순서 통계) 에서 가장 작은 값입니다 .kA