103. 二叉树的锯齿形层次遍历

 思路:

(1)假设根节点在第零层,这样的话,偶数层从左往右遍历,奇数层从右往左遍历。

(2)假设使用队列,而且9下面有子节点

 第0层没问题,

第1层要想实现从右往左遍历,得先入队20,再入队9,

但是第2层又要从左往右遍历了,但是第一行先出队的确是20,这就不行了,得先入队9的节点才行,这样第二层才能实现从左往右遍历,综上所述,需要栈

(3)首先设置偶数层的栈even,和奇数层的栈odd

(4)之后,还以上方的树为例,3入栈偶数层栈,在循环里面,偶数层出栈,之后9,20顺序入奇数层的栈。

(5)到了奇数层,出栈,出的是20(先入后出)把20这个数加入当前层的结果里面,然后把7,15再次入even栈。之后奇数层出栈9

(6)又到了偶数层,出栈,这次是15,然后把15的左,右子树相继入奇数层的栈。。。实现了偶数层从左往右遍历,奇数层从右往左遍历

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
        List<List<Integer>> res=new ArrayList<>();//假设根节点在第0层,偶数层从左向右
        Stack<TreeNode> evenLevel = new Stack<>();//记录偶数层的节点栈
		Stack<TreeNode> oddLevel = new Stack<>();//记录奇数层的节点栈
        if(root==null) return res;
        evenLevel.push(root);
        for(int i=0;!evenLevel.isEmpty()||!oddLevel.isEmpty();i++)
        {
            res.add(new ArrayList<Integer>());
            if(i%2==0)//如果是偶数层,下一层奇数层该从右往左遍历了,因为栈是先入后出,所以应该先入栈每个节点的左子节点
            {
                while(!evenLevel.isEmpty())
                {
                    TreeNode t=evenLevel.pop();
                    res.get(i).add(t.val);
                    if(t.left!=null) oddLevel.push(t.left);
                    if(t.right!=null) oddLevel.push(t.right);


                }
            }
            else
            {
                while(!oddLevel.isEmpty())//这是奇数层,下一层是偶数层,所以说要先入栈右子树
                {
                    TreeNode t=oddLevel.pop();
                    res.get(i).add(t.val);
                     if(t.right!=null) evenLevel.push(t.right);
                    if(t.left!=null) evenLevel.push(t.left);//这里判断条件写反了,卡了好久

                }
            }

        }
        return res;

    }
}

  

原文地址:https://www.cnblogs.com/lzh1043060917/p/12836452.html