java.util.NoSuchElementException在while循环中报错
今天在做一道二叉树的层序遍历的题目时遇到了这个错误,在网上查了下,别人遇到这个报错的时候大部分是在使用iterator迭代器的时候,所以我猜大概是我的循环判断条件有误导致了这个错误。
以下是我的循环部分的出错代码:
while(root!=null)
{
if(root.left!=null) //root的左子树不为空,则入队列
que.offer(root.left);
if(root.right!=null) ///root的右子树不为空,则入队列
que.offer(root.right);
que.poll(); //root出队列
list.add(root.val);//将root的值放进list中
root = que.getFirst();//root指向当前队列头
}
问题应该是出在最后一句上了,root在指向队列头的时候,没有判断一下此时的队列是否为空
root = que.getFirst();
如果给这句加上判断条件,改成这样,就没有报错了。
if(!que.isEmpty())
root = que.getFirst();
else {
root=null;
break;
}
或者直接在整个while循环中,将判断条件改成判断队列是否为空,并且将root指向队列头的这句提前到while开头处,也不会报错
while(!que.isEmpty())
{
root = que.getFirst();
if(root.left!=null)
que.offer(root.left);
if(root.right!=null)
que.offer(root.right);
que.poll();
list.add(root.val);
//root = que.getFirst();
}
以上就是NoSuchElementException的解决。下面顺便贴上二叉树层序遍历的队列解法。
思路:首先将A入队,然后A出队的时候将它的左右子树入队;接下A的左子树出队,同时将A的左子树的左右孩子入队;再A的右子树出队,同时将右的左右孩子入队……
代码如下:
import java.util.ArrayList;
import java.util.ArrayDeque;
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {
ArrayList<Integer> list = new ArrayList<Integer>();
ArrayDeque<TreeNode> que = new ArrayDeque<TreeNode>();
if(root==null)
{
return list;
}
que.offer(root);
while(!que.isEmpty())
{
root = que.getFirst();
if(root.left!=null)
que.offer(root.left);
if(root.right!=null)
que.offer(root.right);
que.poll();
list.add(root.val);
}
return list;
}
}