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整型二维数组
     */
    int level = 1;
    List<List<Integer>> ret = new ArrayList<>();
    Queue<TreeNode> q = new LinkedList<>();

    public int[][] ZLevelOrder(TreeNode root) {
        // 如果根节点为空,直接返回空数组
        if (root == null) {
            return new int[0][0];
        }

        // 将根节点加入队列
        q.add(root);

        // 创建一个列表 ele,用于存储当前层级的节点值
        List<Integer> ele = new ArrayList<>();

        // 循环遍历队列,直到队列为空
        while (!q.isEmpty()) {
            // 获取当前层级的节点个数
            int size = q.size();

            // 遍历当前层级的节点
            for (int i = 0; i < size; i++) {
                // 将节点值加入到列表 ele 中
                ele.add(q.peek().val);

                // 如果当前节点的左子节点不为空,将左子节点加入队列
                if (q.peek().left != null) {
                    q.add(q.peek().left);
                }

                // 如果当前节点的右子节点不为空,将右子节点加入队列
                if (q.peek().right != null) {
                    q.add(q.peek().right);
                }

                // 弹出队列头部节点
                q.poll();
            }

            // 如果层数为偶数,将列表 ele 倒序
            if (level % 2 == 0) {
                reverseList(ele);
            }

            // 将列表 ele 添加到结果 ret 中
            ret.add(ele);

            // 清空列表 ele
            ele = new ArrayList<>();

            // 层数加一
            level++;
        }

        // 将结果 ret 转为二维数组并返回
        int[][] ans = new int[ret.size()][];
        for (int i = 0; i < ret.size(); i++) {
            List<Integer> sublist = ret.get(i);
            ans[i] = new int[sublist.size()];
            for (int j = 0; j < sublist.size(); j++) {
                ans[i][j] = sublist.get(j);
            }
        }
        return ans;
    }

    private void reverseList(List<Integer> list) {
        int left = 0;
        int right = list.size() - 1;
        while (left < right) {
            int temp = list.get(left);
            list.set(left, list.get(right));
            list.set(right, temp);
            left++;
            right--;
        }
    }
}

这段代码使用Java语言实现了二叉树的层序遍历,并按照Z字形(之字形)顺序输出节点的值。主要逻辑如下:

  1. 定义了一个TreeNode类作为二叉树的节点类,包含节点值val、左子节点left和右子节点right
  2. 创建了一个Solution类,包含了一些成员变量:level表示当前层数,初始值为1;ret是二维列表,用于存储最终结果;q是队列,用于层序遍历树的节点。
  3. 实现了一个ZLevelOrder方法,接收一个二叉树的根节点作为参数,返回一个二维数组。方法内部进行层序遍历。
  4. 如果根节点为空,则直接返回空数组。
  5. 将根节点加入队列中。
  6. 创建一个列表ele,用于存储当前层级的节点值。
  7. 循环遍历队列,直到队列为空:获取当前层级的节点个数size。遍历当前层级的节点:将节点值加入列表ele中。如果当前节点的左子节点不为空,则将左子节点加入队列。如果当前节点的右子节点不为空,则将右子节点加入队列。弹出队列头部节点。如果层数为偶数,将列表ele倒序。将列表ele添加到结果ret中。清空列表ele。层数加一。
  8. 将结果ret转为二维数组并返回。