题目描述
给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例如:
给定二叉树 [3,9,20,null,null,15,7],
    3
   / \
  9  20
    /  \
   15   7
返回锯齿形层次遍历如下:
[
  [3],
  [20,9],
  [15,7]
]
解题思路
考虑到题目需要用折线得方式遍历,就是说在遍历的过程中需要有反向操作,可以联想到使用栈来实现。
双栈法
- 建立两个栈
stack1和stack2 - 把二叉树的根节点
push进stack1 - 使用一个
while循环,pop当前节点的子结点,然后push进另一个栈,这样每处理一个栈,就在最终结果ans里面加一个列表(当前深度的节点) 
源代码
public List<List<Integer>> zigzagLevelOrder (TreeNode root) {
    List<List<Integer>> ans = new ArrayList<List<Integer>>();
    if (root== null) return ans;
    Stack<TreeNode> stack1 = new Stack<>();
    Stack<TreeNode> stack2 = new Stack<>();
    TreeNode cur = root;
    stack1.push(cur);
    while (!stack1.isEmpty() || !stack2.isEmpty()) {
        List<Integer> temp = new ArrayList<>();
        while (!stack1.isEmpty()) {
            cur = stack1.pop();
            temp.add(cur.val);
            if (cur.left !=null) stack2.push(cur.left);
            if (cur.right !=null) stack2.push(cur.right);
        }
        ans.add(temp);
        temp = new ArrayList<>();
        while (!stack2.isEmpty()) {
            cur = stack2.pop();
            temp.add(cur.val);
            if (cur.right !=null) stack1.push(cur.right);
            if (cur.left !=null) stack1.push(cur.left);
        }
        if (!temp.isEmpty()) {
            ans.add(temp);
        }
    }
    return ans;
}
心得体会
一开始只用了一个栈和一个列表来实现,怎么也调不通,后来参考了讨论区的解答,使用双栈,豁然开朗。