2011-11-11 7 views
1

私は、任意のバイナリ検索ツリーの深さ優先探索を行うコードの短い断片を持っています。これは私のコードです:この深さ優先検索でNullPointerExceptionが生成されるのはなぜですか?

public void printByDepth() 
{ 
    Queue<BinaryNode<T>> queue = new LinkedList<BinaryNode<T>>(); 
    BinaryNode<T> current = this; 
    queue.add(current); 
    while(!queue.isEmpty()){ 
     current = queue.remove(); 
     System.out.println(current.element); 
     if(current.left != null) 
      queue.add(current.left); 
     if(current.right != null) // had an extra semicolon here, fixed 
      queue.add(current.right); 
    } 
} 

それはかなり標準キューのアプローチですが、何らかの理由でライン8(println(current.element))は、NPEを生成します。私が使用しているツリーは、次のDF出力を生成する必要があります。F B G A D I C E H。私はこれを正確に紙でやったことがあります。なぜ、これが起こっているのかわからないので、ツリー全体(この場合は少なくとも)を横断する前に、current = nullまたはqueue.isEmpty()= trueにするべきではありません。いずれのノードもヌル・コンテンツを持たない。

さらに興味深いことに、while条件をwhile(current != null)に変更すると、NPEは取得されませんが、出力はF B G A D Iです。最後のレベルの要素がありません。

私は確信しているが、私は欠けている何か簡単な...任意のヒント?

EDIT:暴走セミコロン=(おかげで、ロジャー

+1

あなたの最善の策は、デバッガでコードをシングルステップにあります。 –

+0

最後の 'current = queue.peek();'は冗長でなければなりません。 –

+0

@PeterLawrey Lawrey:おっと、そうです。手でデバッグしようとしましたが、削除するのを忘れてしまいました。 – user991710

答えて

6

問題。。。 current.rightがnullでない場合 は、その後、何もしないことの後、常にcurrent.rightを追加:?;:とされる。これは基本的に意味している場合に()

if(current.right != null); 
     queue.add(current.right); 

あなたのセミコロンを参照してください。 (nullの場合でも)キューに追加します。

これはあなたのインデントとして見ることが容易になるあなたのオートフォーマットのコードならば、今偽ってcurrent.rightの追加は、if文に属していることを示唆しています。

+0

私の神...恐ろしい...私はすでにコンパイラのバグを考えていました。ナイスキャッチ。 +1 –

+0

ああ!これはちょうど早朝にこのようなものを試してみないように私に思い出させる。 鋭い目に感謝します! – user991710

+0

@ user991710 ...それとも、Javaコード規約のような中括弧を使用するように指示します。 –

0

最後current = queue.peek();が冗長である必要がありwhile(current != null)「修正」の問題は、あなたがリストでnull値を持って提案しているという事実

+0

上記の私のコメントを見てください。私は徹底的にチェックし、ノードのどれもnull要素を含んでいません(存在しない子へのポインタのほかに)。それはキューで動作する必要がありますので、 は、これと同じツリーは、/前/後順での私の実装で働いていた... – user991710

+0

あなたが問題を再現するための簡単な自己完結型のテストを構築することができますか? –

関連する問題