2016-11-19 9 views
1

私はツリーの検索アルゴリズムを書こうとしていますが、私はひっくり返っています。再帰関数を使用していますが、再帰部分にエラーがあります。あなたはデバッグ時にそれを見つけることができます。ツリー内でアルゴリズムを検索する

private Node SeachNode(Node node, IComparable value) 
     { 


      if (node == null) return null; 

      int comp = value.CompareTo(node.Letter.LetterName); 

      if (comp == 0) return node; //Found it 
      if (comp < 0) SeachNode(node.Left, value); //The item must be in the left subtree 
      return SeachNode(node.Right, value); // The item must be in the right subtree 
     } 

このコードでは、私はツリー内で自分の価値を見つけようとしています。たとえば、私はツリー内の "ACD"ノードを検索したい、私はルートから検索を開始する。 rootがnullの場合は終了します。そうではない、それを比較してください。 rootが応答しない場合は、rootを返します。比較結果が-1を返す場合、ルートの左をチェックします。しかし、コードはルートの右には行きません。私はそれが帰りの声明のために行くことはないと思います。

はあなたが後方検索結果を伝播するためには、両方の左と右に、各再帰呼び出しの値を返すために returnステートメントを使用する必要があります:)

+0

[MCVE]ガイダンスを読み、問題を示す適切なサンプルを提供してください。これまでに投稿したコードには特に問題はありません。 –

答えて

1

を支援していただきありがとうございます。

if (comp == 0) return node; //Found it 
if (comp < 0) return SeachNode(node.Left, value); //The item must be in the left subtree 
return SeachNode(node.Right, value); // The item must be in the right subtree 
+0

いいえ。もう一度チェック。たとえば、ROOT A、左BのRIGHT C、あなたはCを調べています。コードチェックでROOTを返し、-1を返します。左に進み、AとC -1をチェックします。もう一度左に行くと、左はnullです。このとき、関数は正しくチェックする必要がない限りnullを返します。( – Berkin

+2

@Berkinあなたは問題を示すサンプルを提供していませんでした。この回答は、誤植(ブランチの1つに 'return'がありません)を修正しますが、あなたが持っている特定の問題(正しいコードはあなたが提供したものよりもうまくいく可能性がありますが、例えばデータが無効な場合はうまくいかないかもしれません)。 –