我有一小段代码可以生成任意二叉搜索树的深度优先搜索。这是我的代码:
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
,它缺少最后一级的元素。
我确信有一些简单的我错过了...任何提示?
编辑:失控分号=(谢谢,罗杰。
答案 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
值。