2

プリオーダートラバーサルは深さ優先のアルゴリズムですか?私は下の検索でそれを使用しています。私は以下のコードを含んでいます。予約注文トラバーサルは深さ優先の方法ですか?

public bool DFS1(int value, BSTNode root) 
{ // Pre-order search 

    if (root == null) 
     return false; 

    if (root.data == value) 
    { 
     Console.WriteLine("found"); 
     return true; 
    } 

    DFS1(value, root.left); //vist the left node 
    return DFS1(value, root.right); // vist the right node. 
} 
+2

左回帰の結果は無視されます。左が成功すれば正しい検索は必要ありません。 – molbdnilo

+1

@ A.Sarid基本的な問題は重複しています。しかし、OPは、この質問をオープンにしている(IMHO)令状を解決するために二重帰納に問題があります。 – Prune

答えて

3

はい、深さ優先です。元のルートの右ノードを見る前に、完全に左のサブツリーを完成させます。しかし、その左の検索の結果を考慮する必要があります。現時点では、右端のノードに目標値がある場合、が返されます。左側はを返した場合、権利を実行しないように

return DFS1(value, root.left) or 
     DFS1(value, root.right) 

ほとんどのコンパイラは、この(短絡)を最適化します。そうでない場合は、自分で書くことができます。

if (DFS1(value, root.left)) 
    return true; 
else 
    return DFS1(value, root.right); 
+0

@プルーン - 良いキャッチ。私は、再帰的な2つの呼び出しの後に返す方法を知らなかった。なぜなら、終了コードの "return false"が誤った値を返すからである。 OR条件を使用せずに戻る別の方法がありますか? –

+0

確かに...編集を参照してください。 – Prune

+0

@ Prune-ありがとう。これは私が心に持っていたものです。 –

関連する問題