public ArrayList<ArrayList<Integer>> zigzagLevelOrder(TreeNode root) {
ArrayList<ArrayList<Integer>> res = new ArrayList<>();
if (root == null) return res;
Queue<TreeNode> q = new LinkedList<>();
q.add(root);
boolean reverse = false;
while (!q.isEmpty()) {
ArrayList<Integer> level = new ArrayList<>();
int size = q.size();
for (int i = 0; i < size; i++) {
TreeNode tmp = q.poll();
level.add(tmp.val);
if (tmp.left != null) q.offer(tmp.left);
if (tmp.right != null) q.offer(tmp.right);
}
if (reverse) {
Collections.reverse(level);
reverse = false;
} else {
reverse = true;
}
res.add(level);
}
return res;
}