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

二叉树层序遍历Java实现问题排查及修复方法咨询

二叉树层序遍历代码问题分析与修复

代码存在的问题

这段代码的核心问题出在for循环的终止条件使用了动态变化的queue.size():

  • 遍历当前层节点时,我们会不断将当前节点的左右子节点加入队列,导致队列长度queue.size()在循环执行过程中持续变化。
  • 这会让for循环的执行次数超出当前层实际节点数,错误地把下一层的节点混入当前层结果中,最终导致层序遍历的分层完全混乱。

修复方法

解决思路是提前缓存当前层的节点总数,用这个固定值作为for循环的终止条件,规避队列动态变化带来的影响:

  1. 进入for循环前,先获取当前队列的长度(即当前层的节点数),存入临时变量levelSize;
  2. 让for循环基于这个固定的levelSize遍历当前层的所有节点。

修复后的代码如下:

public List<List<Integer>> levelOrder4(TreeNode root) {
    List<List<Integer>> result = new ArrayList();

    // edge case check
    if(root == null) return result;

    // use queue to store nodes
    Queue<TreeNode> queue = new LinkedList();
    queue.add(root);

    // process nodes level by level
    while(!queue.isEmpty()) {
        List<Integer> level = new ArrayList();
        // 提前缓存当前层的节点数量,避免队列动态变化影响循环次数
        int levelSize = queue.size();

        for(int i = 0; i < levelSize; i++) {
            TreeNode node = queue.poll();
            level.add(node.val);

            if(node.left != null) queue.add(node.left);
            if(node.right != null) queue.add(node.right);
        }
        result.add(level);
    }
    return result;
}

修复逻辑说明

通过int levelSize = queue.size()提前锁定当前层节点数,确保for循环只会处理当前层的所有节点,新增的子节点会留在队列中等待下一轮while循环处理,这样就能严格保证每层节点被正确分组,得到符合要求的层序遍历结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 09:12:05