题目地址

思路

  1. 同上一题的思路,层序遍历+队列确认长度遍历
  2. 相对上一题多了一个奇偶判断,选择左/右顺序输出,通过数组头插法或者尾插法就可以实现调整输出顺序
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> matrix = new ArrayList();
        scanTree(root,matrix);
        return matrix;
    }

    public void scanTree(TreeNode node, List<List<Integer>> matrix) {
        if (node == null) return;
        Queue<TreeNode> queue = new LinkedList();
        queue.add(node);
        // 记录处理的层数
        int row = 0;
        // 外层循环,每次处理一层
        while (!queue.isEmpty()) {
            // 上一层的数量
            int len = queue.size();
            LinkedList<Integer> level = new LinkedList();
            for(int i = 0; i < len ; i++) {
                TreeNode n = queue.poll();
                if (row % 2 == 0) { 
                    // 如果偶数,从左到右,使用尾插法
                    level.offerLast(n.val);
                } else {
		    // 如果奇数,从右到左,使用头插法
                    level.offerFirst(n.val);
                }
                if (n.left != null) queue.add(n.left);
                if (n.right != null) queue.add(n.right);
            }
            row = row + 1;
            matrix.add(level);
        }
    }
}

Q.E.D.


每一个平凡的日常都是连续的奇迹