题目
给你二叉树的根节点 root ,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
题解
reverse
class Solution {
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
Queue<TreeNode> que = new LinkedList<>();
List<List<Integer>> res = new ArrayList<List<Integer>>();
if (root == null){
return res;
}
que.offer(root);
boolean flag = true;
while(!que.isEmpty()){
List<Integer> temp = new ArrayList<>();
int size = que.size();
while(size > 0){
TreeNode node = que.poll();
temp.add(node.val);
if (node.left != null) que.offer(node.left);
if (node.right != null) que.offer(node.right);
size--;
}
if (!flag){
Collections.reverse(temp);
}
res.add(temp);
flag = !flag;
}
return res;
}
}
双端队列
将每一层的结果保存到双端队列中,更加层数选择从队首还是队尾加
class Solution {
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
Queue<TreeNode> que = new LinkedList<>();
List<List<Integer>> res = new ArrayList<List<Integer>>();
if (root == null){
return res;
}
que.offer(root);
boolean flag = true;
while(!que.isEmpty()){
Deque<Integer> temp = new LinkedList<>();
int size = que.size();
while(size > 0){
TreeNode node = que.poll();
if (flag){
temp.offerLast(node.val);
}else{
temp.offerFirst(node.val);
}
if (node.left != null) que.offer(node.left);
if (node.right != null) que.offer(node.right);
size--;
}
res.add(new LinkedList<Integer>(temp));
flag = !flag;
}
return res;
}
}