题目
给定一个二叉树,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例如:
给定二叉树 [3,9,20,null,null,15,7],
返回锯齿形层序遍历如下:
[
[3],
[20,9],
[15,7]
]
分析
实际上就是层序遍历的问题,类似问题有求二叉树的层序遍历。将每层的遍历结果装入List中,偶数层的遍历结果最后反转过来即可。使用LinkedList保存信息,LinkedList实现了接口Queue,可以当队列用。关键点在于如何将不同层的节点区分开来。这里我们用一个变量n来记录每一层的节点个数,遍历完一层的n个节点后再一次执行while循环。
代码
class Solution {
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
LinkedList<TreeNode> list=new LinkedList<>();
List<List<Integer>> res=new ArrayList<>();
if(root==null) return res;
list.add(root);
while(list.size()!=0){
int n=list.size();//每层的节点个数
ArrayList<Integer> level=new ArrayList<>();
for(int i=0;i<n;++i){
TreeNode cur=list.removeFirst();
if(cur.left!=null) list.add(cur.left);
if(cur.right!=null) list.add(cur.right);
level.add(cur.val);
}
res.add(level);
}
//将相应层的遍历结果反转
for(int i=0;i<res.size();i++){
if(i%2==1) {
List<Integer> temp=res.get(i);
Collections.reverse(temp);
res.set(i,temp);
}
}
return res;
}
}
原题链接:https://leetcode-cn.com/problems/binary-tree-zigzag-level-order-traversal