思路:
(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