답변:
Ran G.는 효율적인 알고리즘에 대한 힌트를 주었지만 세부 사항은 생략했을 것입니다. 모든 루트 리프 경로를 계산하는 것은 실제로 각 경로를 계산 한 다음 길이를 계산하는 경우와 같이 반복해서 작업을 수행하는 경우 약간 비효율적입니다.
다음과 같은 재귀 알고리즘을 수행 LongestPath(root)
하면 원하는 것을 얻을 수 있습니다. 기본적으로 각 하위 트리의 가장 긴 경로를 재귀 적으로 계산합니다. 각 노드에서 새 경로를 만들고 가장 긴 경로를 반환해야합니다.
LongestPath(node)
If node is a leaf, return (node,0)
If node is not a leaf:
For each edge (node,length,next):
Let (p,l) = LongestPath(next)
Let (path,len) = (p++[next], l + length)
Return element (path,len) from previous step with largest value len
이것은 하스켈 표기법을 가진 의사 코드의 조합이므로 이해할 수 있기를 바랍니다.