103. 二叉树的锯齿形层次遍历
2025-04-14 10:58:22

思路

这题也是按层遍历,因此我们自然想到也用队列来处理。

那么如何在隔层反向输出呢?其实我们无需更改BFS的遍历顺序,而是不断插入临时链表的头部, 这样我们自然就得到了反向。

知识点

Java的List接口有多种实现,在只需要频繁插入头尾节点时,使用LinkedList会快一点。反之,在需要随机读取时,使用ArrayList会快非常多。

Code

class Solution {
    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
        List<List<Integer>> ans = new ArrayList<>();
        Deque<TreeNode> queue = new LinkedList<>();
        if (root == null) return ans;
        queue.offer(root);
        while (!queue.isEmpty()) {
            //List也可以是linkedList
            List<Integer> curLevel = new LinkedList<>();
            int size = queue.size();
            for (int i = 0; i < size; i++) {
                TreeNode node = queue.poll();
                if (ans.size() % 2 == 0) curLevel.add(node.val);
                else curLevel.addFirst(node.val);
                if (node.left != null) queue.offer(node.left);
                if (node.right != null) queue.offer(node.right);
            }
            ans.add(curLevel);
        }
        return ans;
    }
}