回答:
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
これは、Haskell表記と疑似コードの組み合わせであるため、わかりやすいものであることを願っています。