You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树的自底向上层序遍历迭代器遍历无输出问题求助

树自底向上层序遍历无输出问题排查与修复

嘿,我一眼就瞅出你代码里的关键问题啦!咱们一步步拆解:

核心问题:迭代器next()重复调用导致元素丢失/异常

你这段代码里最大的bug是每次循环调用了两次itr.next():

Iterator itr=s.iterator(); while(itr.hasNext()) { if(itr.next()==null) System.out.println(); else { ArrayList al2=(ArrayList)itr.next(); ... } }

迭代器的next()方法每次调用都会移动指针到下一个元素,也就是说:

  • 第一次调用itr.next()(在if判断里)已经消耗了当前元素
  • 进入else分支后再次调用itr.next(),拿到的是下一个元素,直接跳过了原本要处理的当前元素
  • 如果栈里元素数量是奇数,最后一次循环还会抛出NoSuchElementException,直接终止程序,自然看不到任何输出

修复迭代器问题的代码

把itr.next()的结果先存到变量里,整个循环只调用一次next():

Iterator itr = s.iterator();
while(itr.hasNext()) {
    // 只调用一次next(),把当前元素存起来
    Object current = itr.next();
    if(current == null) {
        System.out.println();
    } else {
        ArrayList al2 = (ArrayList) current;
        for(int i=0; i<al2.size(); i++) {
            System.out.println(al2.get(i));
        }
    }
}

额外需要检查的点

除了迭代器的问题,还要确认你的栈是否正确填充了元素:

  • 自底向上层序遍历的正确逻辑应该是:先用队列做常规层序遍历,把每层的节点存入ArrayList,再把这些ArrayList依次压入栈(或者最后反转层序结果列表)
  • 如果栈本身是空的,或者你在填充栈的时候逻辑错误(比如没把每层的ArrayList正确推入栈),那迭代自然也不会有输出

优化建议:使用泛型提升代码安全性

建议给栈和ArrayList指定泛型,避免强制类型转换的风险,比如:

Stack<ArrayList<TreeNode>> s = new Stack<>();
// 填充栈的逻辑...
Iterator<ArrayList<TreeNode>> itr = s.iterator();
while(itr.hasNext()) {
    ArrayList<TreeNode> al2 = itr.next();
    for(TreeNode node : al2) {
        System.out.println(node.val); // 假设TreeNode有val属性
    }
}

内容的提问来源于stack exchange,提问作者Siddharth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:03:11