2016-12-11 4 views
1

多方向の木の中で最長の経路を見つけることにほぼ完全に対応することができる、適用された数学の問題があります。多道の木と構造

私は子ノード(条件を満たす空間上の点)を与える関数child()を持っています。唯一の注意点は、child()がルートノードを含めてそれに接続されているすべての以前のノードを必要とすることです。ここで私は自分のコードを再帰的に書くのに苦労しています。これまでのところ、私は以下のようなものを持っています。

def multitree(node): 
    tmp_list = child(node) 
    for child2 in tmp_list: 
      if len(child(child2)))==0:  #if you hit a leaf (dead end), go to next element 
       continue 
      else: 
       multitree(child2) 

しかし、この時点で、私は何を返すか分からない。私は本質的に私がすべての葉に達するまで、マルチウェイツリー全体をマップしたいと思う。任意のアイデアやヒント?みんなありがとう。

編集:

アップデート1:完全のために、私がスケッチどのような入力子()の目安が必要です。https://i.imgur.com/3MkfsYc.png基本的には、矢印子でマークされたノードの子ノードを見つけるために()が必要ですルートとノード自体との間のノードのリスト、すなわち赤い点でマークされたノード。

アップデート2:

私は以下のように、子(ノード)を書いたと私は現在、それに取り組んでいます -

def pathwalk(node): 

    children = child(node) 
    paths = [child(node.append(kid)) for kid in children] 

    return paths 
+0

最長のパスを見つけたり、すべてのパスを取得してそこから最長のパスを探したいだけですか? – Iluvatar

+0

ツリー内のすべてのパスを返す標準的な深さ優先検索や幅優先検索を使用しないで、それに渡って 'max(paths、key = len)'だけを使用する理由はありますか?ところで、単純なスタックやキューと再帰を使ってこれらの検索を行う方が簡単です。 – AChampion

+0

ランタイムが大きく違わない場合は、最長のパスに加えてすべてのパスを表示したいと思います。どのように私は上記の場合にDFSまたはBFSを実装するか考えていますか?私がDFSやBFSのすべての例を見てきたのは、すでに「マッピングされている」ツリーであったためです。この中で、私は葉を打つまで子ノードを再帰的に見つけることしかできません。私は子供()がノードだけでなく、それとルートノードの間のすべてのノードを入力しなければならないというこの警告を持っています。 –

答えて

1

あなただけの最長のパスを取得するには、このような何かを行うことができます。

def longest_path(node): 
    children = child(node) 

    if not children: # leaf node 
     return [node] 

    children_vals = [longest_path(c) for c in children] 
    longest = max(children_vals, key=len) 
    return [node] + longest 

はネクタイを扱う、というか、任意のオプションを選択しない:ここでは、それはあなたが任意の関連情報を抽出することができ、そこから、あなたのノードのリストを取得します。

(注:半テスト済み)

+0

小さな提案: 'もし子供でないなら、' 'len(子ども)== 0 'よりももっとpythonicと考えられます。 – SuperSaiyan

+0

うーん、良い点。 – Iluvatar

+0

私は実際に "最大反復深さがcmpを超えました"というエラーを受けました。何か案は? –

0

私はこの問題を発見したと思います。私はすべてのノードの実行リストを保持したかったので、あなたが歩いているパスを追跡しています(imgur picを参照)。 Illuvatarのルーチンを追加して編集しました

children_vals = [longest_path(node+[c]) for c in children] 

こうして、すべての親をその子と再帰的に連結します。