103.二叉树的锯齿形层次遍历
难度:中等
标签:树,BFS
给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例如:
给定二叉树 [3,9,20,null,null,15,7],
3
/
9 20
/
15 7
结果:
[
[3],
[20,9],
[15,7]
]
思路:层次遍历有三种能够记录层数的办法,分隔符(例如使用在每层结束的后面加上一个空结点),然后每层从做向右,或者从右向左
第二个就是,记录队列的大小,然后遍历完,遍历的时候,添加左右孩子
第三个就是使用两个指针,一个指向这一层最后一个结点,另一个用来寻找下一层最后一个结点
List<List<Integer>> res=new ArrayList<>();
if(root==null) return res;
Deque<TreeNode> que=new ArrayDeque<>();
que.addLast(root);
int level=0;
TreeNode T=null;
while(!que.isEmpty()){
int size=que.size();
List<Integer> subres=new ArrayList<>();
for(int i=0;i<size;i++){
if(level%2==0){
//偶数层,从做到右
T=que.removeFirst();
subres.add(T.val);
if(T.left!=null){
que.addLast(T.left);
}
if(T.right!=null){
que.addLast(T.right);
}
}
else{
//奇数层,从右向左
T=que.removeLast();
subres.add(T.val);
if(T.right!=null){
que.addFirst(T.right);
}
if(T.left!=null){
que.addFirst(T.left);
}
}
}
level++;
res.add(subres);
}
return res;