题目考察的知识点:这道题目考察了二叉树的层序遍历以及对遍历过程中节点值的处理。同时,由于要求以 Z 字形顺序遍历二叉树,需要根据每层的遍历方向将节点值插入到对应位置。
题目解答方法的文字分析:题目要求按 Z 字形顺序遍历二叉树,并返回每层节点值的二维数组。解决方法是利用队列进行层序遍历,并根据每层的遍历方向将节点值插入到相应位置。具体步骤如下:
- 创建一个队列用于层序遍历,初始化结果数组
result
。 - 使用一个变量
leftToRight
记录当前层的遍历方向,初始值为true
。 - 遍历队列直至为空:获取当前层的节点数量 levelSize。创建一个临时数组 levelValues 用于存储当前层的节点值。遍历当前层的节点:弹出队列中的节点,将其值添加到 levelValues 中。如果遍历方向为从右到左,将节点值插入到 levelValues 的起始位置。将节点的左右子节点加入队列中。将 levelValues 添加到 result 中。切换遍历方向 leftToRight。
- 将
result
转换为 int 整型二维数组并返回。
本题解析所用的编程语言:本题解析使用了 Java 编程语言。
完整且正确的编程代码:
import java.util.*; /* * public class TreeNode { * int val = 0; * TreeNode left = null; * TreeNode right = null; * public TreeNode(int val) { * this.val = val; * } * } */ public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param root TreeNode类 * @return int整型二维数组 */ public int[][] ZLevelOrder (TreeNode root) { ArrayList<ArrayList<Integer>> result = new ArrayList<>(); if (root == null) { return new int[0][]; } Queue<TreeNode> queue = new LinkedList<>(); queue.offer(root); boolean leftToRight = true; while (!queue.isEmpty()) { int levelSize = queue.size(); ArrayList<Integer> levelValues = new ArrayList<>(); for (int i = 0; i < levelSize; i++) { TreeNode node = queue.poll(); if (leftToRight) { levelValues.add(node.val); } else { levelValues.add(0, node.val); } if (node.left != null) { queue.offer(node.left); } if (node.right != null) { queue.offer(node.right); } } result.add(levelValues); leftToRight = !leftToRight; } int[][] resArray = new int[result.size()][]; for (int i = 0; i < result.size(); i++) { ArrayList<Integer> level = result.get(i); int[] levelArray = new int[level.size()]; for (int j = 0; j < level.size(); j++) { levelArray[j] = level.get(j); } resArray[i] = levelArray; } return resArray; } }