为什么这个深度优先搜索会产生NullPointerException?

时间:2011-11-11 10:52:01

标签: java nullpointerexception binary-tree

我有一小段代码可以生成任意二叉搜索树的深度优先搜索。这是我的代码:

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,它缺少最后一级的元素。

我确信有一些简单的我错过了...任何提示?

编辑:失控分号=(谢谢,罗杰。

2 个答案:

答案 0 :(得分:6)

问题在于:

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

在if上看到你的分号(;)?这基本上意味着: 如果current.right不为null,则不执行任何操作。之后,始终将current.right添加到队列中(即使为null)。

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

答案 1 :(得分:0)

最后current = queue.peek();应该是多余的。 while(current != null)“修复”问题的事实表明您在列表中有null值。