思路:就是层次遍历的变种题目,在层次遍历的基础之上加一个层数的奇偶判断即可!
先来分享一下层次遍历的模板,大家可以多看看,多加练习!

//层次遍历
void levelOrder(Btree T){
    InitQueue(Q);//初始化队列
    Btree p;
    EnQueue(Q, T);//根节点入队
    while(!IsEmpty(Q)){
        DeQueue(Q, p);//节点出队
        visit(p);
        if(p->lchild != null){//节点左子树不为空,则入队
            EnQueue(Q, p->lchild);
        }
        if(p->rchild != null){//节点右子树不为空,则入队
            EnQueue(Q, p->rchild);
        }
    }
} 

层次遍历代码(JZ60):

import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 * }
 */

public class Solution {
    /**
     * @param root TreeNode类 
     * @return int整型ArrayList<ArrayList<>>
     */
    ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();//保存结果
    public ArrayList<ArrayList<Integer>> levelOrder (TreeNode root) {
        // write code here
        if(root==null){ //如果为空,直接返回
            return result;
        }
        Queue<TreeNode> queue = new LinkedList<>();//对列,先进先出
        queue.offer(root);//根节点入队
        while(!queue.isEmpty()){
            ArrayList<Integer> result1 = new ArrayList<>();//存当前层
            int nowlen = queue.size();//队伍中的节点个数
            for(int i = 0;i<nowlen;i++){
                TreeNode nowroot = queue.poll();//获取队首
                result1.add(nowroot.val);//把当前节点的值插入到result1中
                if(nowroot.left != null){
                    queue.offer(nowroot.left);
                }
                if(nowroot.right != null){
                    queue.offer(nowroot.right);
                }
            }
            result.add(result1);//说明当前层结束,将该层结果加入到result中!
        }
        return result;
    }
}

对于本题而言,我们只需要在最后加入result结果中前加一个判断,使用count变量来记录层数,从第一层开始。代码如下:

import java.util.*;
/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 * }
 */
public class Solution {
    /**
     * @param root TreeNode类 
     * @return int整型ArrayList<ArrayList<>>
     */
    ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();//最终结果
    public ArrayList<ArrayList<Integer>> zigzagLevelOrder (TreeNode root) {
        // write code here
          // write code here
        if(root == null){
            return result;
        }
        Queue<TreeNode> queue = new LinkedList<>();//Queue是接口,实现类有LinkedList
        queue.offer(root);//根节点入队
        int count = 1;//记录奇偶层 起始为1
        while(!queue.isEmpty()){
            ArrayList<Integer> result1 = new ArrayList<>();//存当前层
            int nowlen = queue.size();//队伍中当前层的节点个数
            for(int i = 0;i<nowlen;i++){
                TreeNode nowroot = queue.poll();//获取队首
                result1.add(nowroot.val);//把当前节点的值插入到result1中
                if(nowroot.left != null){
                    queue.offer(nowroot.left);
                }
                if(nowroot.right != null){
                    queue.offer(nowroot.right);
                }
            }
            //遍历完当前层后,将结果放入result中
            if(count%2 == 1){
                //奇数层
                result.add(result1);
                count++;
            }else{
                Collections.reverse(result1);//反转
                result.add(result1);
                count++;
            }
        }
        return result;
    }
}