Nous effectuons une recherche en profondeur d'abord en ordre postérieur et nous agrégons les résultats en route, c'est-à-dire que nous résolvons le problème de manière récursive.
Pour chaque nœud avec les enfants (dans l’arborescence de recherche), il existe deux cas:u 1 , … , u kvu1,…,uk
- Le plus long chemin de se trouve dans l’un des sous-arbres .T u 1 , … , T u kTvTu1,…,Tuk
- Le plus long chemin dans contient . vTvv
Dans le second cas, nous devons combiner le ou les plus longs chemins de dans l'un des sous-arbres; ce sont certainement ceux qui ont les feuilles les plus profondes. La longueur du chemin est alors si , ou si , avec le jeu multiple de hauteurs de sous-arbres¹.H ( k ) + H ( k - 1 ) + 2 k > 1 H ( k ) + 1 k = 1 H = { h ( T u i ) | i = 1 , ... , k }vH(k)+H(k−1)+2k>1H(k)+1k=1H={h(Tui)∣i=1,…,k}
En pseudo-code, l'algorithme ressemble à ceci:
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)
}
}
- k AA(k) est la petite valeur de (statistique d'ordre).kA