2012-03-07 15 views
1

DFSの実装については、以下を参照してください。DFSツリートラバーサル関数の変更

protected void DFS(String search) { 
    for(Tree<T> child : leafs) { 
     if(child.value.equals(search)) 
      return; 
     else 
      child.DFS(search);    
     System.out.println(child.value);  
    } 
} 

目的は、その値が変数探索にあるノードを見つけることにトラバーサルを停止することです。しかし、上記の関数は、宣言された検索ノードを越えてもツリーを横断し続ける。誰かが上記の機能を変更する手助けをすることができますか?

ありがとうございます。


編集1

protected boolean DFS(String anaphorKey) { 
    boolean found = false; 
    for(Tree<T> child : leafs) { 
     if(child.head.equals(anaphorKey)) 
      return true; 
     found = child.DFS(anaphorKey); 
     if(found == true) 
      break;    
     System.out.println(child.head);  
     //System.out.println("anaphorKey: "+anaphorKey); 
    } 
    return found; 
} 

(SJuan76 @)与えられた回答の提案を実装しようとしました。上記の実装は必要に応じて機能していません。ロジックが示すようにコードがない場所に私を向けることができますか?

答えて

3

ルーキー見つけるだろう、私は(forループのクラシックを使用して実装を提案するかもしれませんforループ現在使用され強化ではなく)のようなもの、少し良くあなたのストップコンディションの統合を可能にする:

protected boolean DFS(String key) { 
    boolean found = false; 

    for(int i = 0; i < leafs.size() && !found; i++) { 
     Tree<T> child = leafs.get(i); 

     if(child.head.equals(key)) 
      found = true; 
     else 
      found = child.DFS(key); 
    } 

    return found; 
} 

だから、できるだけ早くお使いのFOUとしてnd条件がヒットすると、「found」が真になり、ループが停止します。

忘れてしまったことは、再帰呼び出しの結果を覚えておく必要がある再帰の "found = child.DFS(key)"部分です。チェーン上のすべてのfor-loopsがあなたが戻ってくるとすぐに。

希望に役立ちます。

+0

ありがとうございます。自分のプログラムを自分のプログラムに入れましたが、それでも動作していません。論理によれば、それは明らかにすべきである。コントロールはif(child.head.equals(key))条件を入力していません。キーは確かにツリーにあります。キャスティングエラーですか? –

+0

解決済み!はい、ジェネリックとストリングの間にキャスティングステートメントが必要でした。 –

+0

注:Riyadが指摘しているトリックは、正しいノードが見つかった場合にループがすべての繰り返しをチェックする必要があることです。 – Jochen

1

オプションA(ニース):この関数は値を返します。ノードが見つかると、ノードが見つからない場合とは異なる値を返します。メソッドに呼び出したときに、foundの値を取得した場合は、ループを停止してfoundの値も返します。

オプションB(醜い):例外が見つかった場合、それを例外にします(自分の実装の方が良い場合)。それをキャッチすることを忘れないでください。

オプションC(Uglier):グローバル(静的)変数と同じです。

UPDATE 1:

それはあなたの方法は、今[OK]を実行する必要があり、あなたの価値が今までに発見された場合は、(System.out.println)を確認することができますように見えますか?より多くの個人的な意見で

、私は

protected boolean DFS(String anaphorKey) { 
    for(Tree<T> child : leafs) { 
    if(child.head.equals(anaphorKey)) 
     return true; 
    if(child.DFS(anaphorKey)) // No need to store value. No need to check == true (it is implicit) 
     return true;    // If we are in this line the value was found, always return true 
    System.out.println(child.head);  
    //System.out.println("anaphorKey: "+anaphorKey); 
    } 
    return false; // If the method did not exit previously it was because the value was not found, so in this line always return false 
} 

をより読み(しかし、それは正確にあなたの実装として動作するはずです)

+0

上記のEdit1をご覧ください。指導が必要です。 –

+0

はい、ノードが見つかると検索が停止します。 [Riyad]によって提案された提案は、発見されたノードから親を通して追跡します。あなたの提案の私の理解に基づいて私が実装したものは、検索ノードの親を通して追跡されません。 –

関連する問題