题目考察的知识点:这道题目考察了二叉树的层序遍历以及对遍历过程中节点值的处理。同时,由于要求以 Z 字形顺序遍历二叉树,需要根据每层的遍历方向将节点值插入到对应位置。

题目解答方法的文字分析:题目要求按 Z 字形顺序遍历二叉树,并返回每层节点值的二维数组。解决方法是利用队列进行层序遍历,并根据每层的遍历方向将节点值插入到相应位置。具体步骤如下:

  1. 创建一个队列用于层序遍历,初始化结果数组 result
  2. 使用一个变量 leftToRight 记录当前层的遍历方向,初始值为 true
  3. 遍历队列直至为空:获取当前层的节点数量 levelSize。创建一个临时数组 levelValues 用于存储当前层的节点值。遍历当前层的节点:弹出队列中的节点,将其值添加到 levelValues 中。如果遍历方向为从右到左,将节点值插入到 levelValues 的起始位置。将节点的左右子节点加入队列中。将 levelValues 添加到 result 中。切换遍历方向 leftToRight。
  4. 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;
    }
}