二叉树层序遍历Java实现问题排查及修复方法咨询
二叉树层序遍历代码问题分析与修复
代码存在的问题
这段代码的核心问题出在for循环的终止条件使用了动态变化的queue.size():
- 遍历当前层节点时,我们会不断将当前节点的左右子节点加入队列,导致队列长度
queue.size()在循环执行过程中持续变化。 - 这会让for循环的执行次数超出当前层实际节点数,错误地把下一层的节点混入当前层结果中,最终导致层序遍历的分层完全混乱。
修复方法
解决思路是提前缓存当前层的节点总数,用这个固定值作为for循环的终止条件,规避队列动态变化带来的影响:
- 进入for循环前,先获取当前队列的长度(即当前层的节点数),存入临时变量
levelSize; - 让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
相关产品推荐
相关产品推荐

