2011-11-11 29 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。我这样做究竟在纸上,我从来不应该让电流= null或queue.isEmpty()我已经(至少在这种情况下)遍历整个树之前=真,所以我不知道为什么会这样。没有节点有空的内容。

另外,有趣的是,如果我将条件改为while(current != null),我没有得到NPE,但输出是:F B G A D I,它缺少最后一级的元素。

我敢肯定有一些简单的我失踪...任何提示?

编辑:逍遥分号=(谢谢你,罗杰

+1

最好的办法是通过与调试器的单步执行代码。 –

+0

最后一个'current = queue.peek();'应该是多余的。 –

+0

@PeterLawrey Lawrey:哎呀,它是。我试图手动进行一些调试,并忘记将其删除。 – user991710

回答

6

问题。用:

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

请参阅您的分号(;)上,如果这基本上意味着:如果 是current.right不为空,则什么也不做之后,随时补充current.right?到队列(即使为空)。

如果您自动格式化你的代码,这将是比较容易看到的你的缩进现在错误地认为current.right的添加属于if语句。

+0

我的上帝......可怕......我已经在想一个编译器错误了。很好的接收。 +1 –

+0

补给它!这只是提醒我不要在凌晨时分尝试这些东西。 感谢敏锐的眼球! – user991710

+0

@ user991710 ......或者它提醒你总是使用花括号,比如Java Code Conventions,建议我们这样做。 –

0

最后current = queue.peek();应该是多余的那while(current != null)“修复”的问题,建议你在列表中null值实际

+0

看到我上面关于窥视的评论。我也仔细检查过,没有一个节点包含空元素(当然除了指向任何不存在的子元素的指针)。 同样的树,我在执行/前/后序的工作,所以应该有一个队列工作... – user991710

+0

你能构造一个简单的自包含的测试重现该问题? –