Sonradan sırayla derinlemesine ilk bir arama yaparız ve yolda toplam sonuçları elde ederiz, yani problemi özyinelemeli olarak çözeriz.
Her düğüm için çocuklu u 1 , ... , u k (arama ağacında) iki durum vardır:vu1, … , Senk
- En uzun yol Alt ağaçlardan birinde yalanlarına T u 1 , ... , T u k .TvTu1, … , Tuk
- En uzun yol içeriyor v .Tvv
İkinci durumda, bir veya iki en uzun yolları birleştirmek zorunda Alt ağaçlardan birine; bunlar kesinlikle en derin yapraklara ait olanlardır. Yolunun uzunluğu daha sonra, 'H ( k ) + * H ( k - 1 ) + 2 ise k > 1 ya da H ( k ) + 1 ise k = 1 olan, H = { s ( t u ı ) | i = 1 , …v'H( k )+ H( k - 1 )+ 2k > 1'H( k )+ 1k = 1 çoklu alt ağaç yüksekliği kümesini¹.'H= { h ( Tuben) | İ = 1 , ... , k }
Sahte kodda, algoritma şuna benzer:
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)
}
}
- olduğu k içinde -smallest değeri A (sıra istatistiği).bir( k )kbir