java.util.NoSuchElementException在while循环中报错,二叉树的层序遍历

本文解析了在二叉树层序遍历中遇到java.util.NoSuchElementException错误的原因及解决方案,通过改进循环条件避免迭代空队列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值