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;
}
}

浙公网安备 33010602011771号