103. Binary Tree Zigzag Level Order Traversal

Recursive

We don’t traverse the tree in zigzag level order but traverse in normal level order. We just reverse the list which has odd height index then return the result.

/**
 * 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>> zigzagLevelOrder(TreeNode root) {
        LinkedList<List<Integer>> res = new LinkedList<>();
        if (root == null) {
            return res;
        }
        helper(root, 0, res);
        for (int i = 0; i < res.size(); i++) {
            if (i % 2 != 0) {
                Collections.reverse(res.get(i));
            }
        }
        return res;
    }

    private void helper(TreeNode root, int height, List<List<Integer>> res) {
        if (root == null) {
            return;
        }
        if (res.size() <= height) {
            res.add(new ArrayList<>());
        }
        res.get(height).add(root.val);
        helper(root.left, height + 1, res);
        helper(root.right, height + 1, res);
    }
}

Iterative

In the iterative solution, we still traverse the tree in normal level order, but use a different way to get the result.

/**
 * 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>> zigzagLevelOrder(TreeNode root) {
        LinkedList<List<Integer>> res = new LinkedList<>();
        if (root == null) {
            return res;
        }

        LinkedList<TreeNode> queue = new LinkedList<>();
        queue.add(root);
        int height = 0;
        while (!queue.isEmpty()) {
            // add a empty list for the current level
            res.add(new ArrayList<>());

            // add all elements to the list
            ArrayDeque<Integer> deque = new ArrayDeque<>();
            int elementLen = queue.size();
            for (int i = 0; i < elementLen; i++) {
                TreeNode node = queue.removeFirst();
                if (height % 2 == 0) {
                    deque.addLast(node.val);
                } else {
                    deque.addFirst(node.val);
                }
                if (node.left != null) {
                    queue.addLast(node.left);
                }
                if (node.right != null) {
                    queue.addLast(node.right);
                }
            }
            res.get(height).addAll(deque);

            // go to the next level
            height++;
        }

        return res;
    }
}