Given the root of a binary tree, return the zigzag level order traversal of its nodes' values (i.e., from left to right, then right to left for the next level, alternating).
root = [3,9,20,null,null,15,7][[3],[20,9],[15,7]]root = [1,2,3,4,5][[1],[3,2],[4,5]]root = [1][[1]]leftToRight = truesz = queue.size(); create LinkedList<Integer> leveladdLast(val) if L→R, addFirst(val) if R←L; enqueue children left→rightleftToRight = !leftToRightChildren are always enqueued left→right, so the queue order never changes. The trick is how we insert into the level list. For L→R levels we call addLast(val) — values accumulate in natural order. For R←L levels we call addFirst(val) — each new value is prepended, reversing the order without any extra reversal pass. After every level we flip leftToRight = !leftToRight. One boolean, zero extra work — O(1) per node.