1+ /**
2+ * Definition for a binary tree node.
3+ * public class TreeNode {
4+ * int val;
5+ * TreeNode left;
6+ * TreeNode right;
7+ * TreeNode() {}
8+ * TreeNode(int val) { this.val = val; }
9+ * TreeNode(int val, TreeNode left, TreeNode right) {
10+ * this.val = val;
11+ * this.left = left;
12+ * this.right = right;
13+ * }
14+ * }
15+ */
16+ /**
17+ * Time: O(n)
18+ * Space: O(n)
19+ */
20+ class Solution {
21+ public List <List <Integer >> zigzagLevelOrder (TreeNode root ) {
22+ List <List <Integer >> levels = new ArrayList <>();
23+
24+ if (root == null ) {
25+ return levels ;
26+ }
27+ ArrayDeque <TreeNode > queue = new ArrayDeque <>();
28+ queue .add (root );
29+ // Do a regular level order traversal
30+
31+ while (!queue .isEmpty ()) {
32+ int size = queue .size ();
33+ List <Integer > thisLevel = new ArrayList <>();
34+
35+ for (int i = 0 ; i < size ; i ++) {
36+ TreeNode current = queue .remove ();
37+ thisLevel .add (current .val );
38+ if (current .left != null ) {
39+ queue .add (current .left );
40+ }
41+ if (current .right != null ) {
42+ queue .add (current .right );
43+ }
44+
45+ }
46+ levels .add (thisLevel );
47+ }
48+
49+ boolean leftToRight = true ;
50+ for (int i = 0 ; i < levels .size (); i ++) {
51+ List <Integer > thisLevel = levels .get (i );
52+ if (leftToRight ) {
53+ // This level is already ordered from left to right
54+ leftToRight = !leftToRight ;
55+ } else {
56+ // reverse this order (right to left) to mimic the zigzag pattern
57+ Collections .reverse (thisLevel );
58+ leftToRight = !leftToRight ;
59+ }
60+ }
61+ return levels ;
62+
63+ }
64+ }
0 commit comments