codeTop100题(21)103. 二叉树的锯齿形层序遍历

57 阅读1分钟

1. 题目

103. 二叉树的锯齿形层序遍历

2. 分析

之前做过一道题目,二叉树的层序遍历,唯一的区别是本题要求我们将偶数层的遍历反过来。 二叉树层序遍历

那么我们最后add到lists里的时候,把list反转一下就可以了,但是这样子会多一次循环,怎么办呢?

我们可以用一个特殊的数据结构,LinkedList,它支持addFirst 和 addLast,偶数的时候我们之间addFirst,就相当于反转了。

3. 代码

public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
    if (null == root) {
        return new ArrayList<>();
    }
    Queue<TreeNode> queue = new ArrayDeque<>();
    queue.add(root);
    List<List<Integer>> lists = new ArrayList<>();
    int c = 1;
    while (!queue.isEmpty()) {
        LinkedList<Integer> list = new LinkedList<>();
        int size = queue.size();
        for (int i = 0; i < size; i++) {
            TreeNode treeNode = queue.poll();
            if (c % 2 == 1) {
                list.addLast(treeNode.val);
            } else {
                list.addFirst(treeNode.val);
            }
            if (null != treeNode.left) {
                queue.add(treeNode.left);
            }
            if (null != treeNode.right) {
                queue.add(treeNode.right);
            }
        }
        lists.add(list);
        c++;

    }
    return lists;
}