题目描述
给定一个二叉树,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
题解
正常层次遍历,用LinkedList
实现保存一层的结果path
,利用count
计数,当count
为奇数的时候,调用path.addFirst()
头插。详见代码注释。
class Solution {
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
//结果
List<List<Integer>> res = new ArrayList<>();
if (root == null) return res;
//层次便利需要的队列
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
//用于计数,奇数的时候反转,偶数的时候不反转
int count = 0;
while (!queue.isEmpty()){
int size = queue.size();
//保存每一层的结果
LinkedList<Integer> path = new LinkedList<>();
for (int i = 0; i < size; i++){
TreeNode tmp = queue.poll();
if (tmp.left != null) queue.add(tmp.left);
if (tmp.right != null) queue.add(tmp.right);
if (count % 2 == 1){
//奇数层,头插
path.addFirst(tmp.val);
}else{
//偶数层,正常从前往后加入
path.addLast(tmp.val);
}
}
//一层遍历结束之后,添加到结果,count++
count++;
res.add(new ArrayList<>(path));
}
return res;
}
}