私は、隣接リストを使って実装されたルートk-aryツリーの直径問題を解くために、再帰を使って線形時間アルゴリズムを見つけようとしています。樹木の直径は、任意の数の葉の間の最大距離である。ルートr
(degree>> 1のノード)を選択すると、同じサブツリー内の2つのリーフの間の最大距離か、パスの2つのリーフ間の最大距離のいずれかが表示されますr
までこの問題の私の擬似コード:ルーテッドk-aryツリーの直径
Tree-Diameter(T,r)
if degree[r] = 1 then
height[r] = 0
return 0
for each v in Adj[r] do
for i = 1 to degree[r] - 1 do
d_i = Tree-Diameter(T,v)
height[r] = max_{v in Adj[r]} (height[v]
return max(d_i, max_{v in V} (height[v]) + secmax_{v in V} (height[v], 0) + 1)
線形時間を得るために、各サブツリーの直径と高さを同時に計算します。次に、各サブツリーの直径とツリーの2つの最大高さの間の最大量を選択します(関数はheight[v]
と0
の間で選択します)。これは、 0
)。私はこのアルゴリズムがうまく動作するかどうかを尋ねます。そうでない場合、問題は何ですか?私はバイナリツリーで同じ問題を解決するアルゴリズムを一般化しようとしましたが、それが良い一般化であるかどうかはわかりません。
ご協力いただきましてありがとうございます。前もって感謝します!
直径は以下のように行う見つけるためのツリーのすべてで
V(資本)とは何ですか?それはAdj [r]と同じですか? –
VはツリーTのすべてのノードを含む集合です。 – Dree
あなたのmax_ {v in}}(...)はrに依存しないので、私はそれを別々に計算していると仮定します。 –