题目
给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例如
给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回锯齿形层次遍历如下:
[
[3],
[20,9],
[15,7]
]
解析
这道题是二叉树层次遍历的变体,不会层次遍历的可以先去看看二叉树的层次遍历。它与一般层次遍历的区别就是每一层遍历的顺序交替由左向右和由右向左。最直接的思想就是用两个栈依此存放不同的层,进行不同的访问顺序。这里使用双端队列(双端队列可以从两端插入删除),以一个boolean类型的变量flag标计访问顺序,具体过程如下,下面的树即是示例中的那棵树。
代码
public class problem103 {
//节点类
public static class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
List<List<Integer>> res = new ArrayList<List<Integer>>();
// 特判
if (root == null)
return res;
// 队列,用于层次遍历
Deque<TreeNode> qu = new LinkedList<TreeNode>();
// 当前位于哪一层
int level = 0;
// 标计当前层次遍历的方向,false表示从左向右,true表示从右向左
boolean flag=false;
qu.add(root);
TreeNode cur;
while (!qu.isEmpty()) {
res.add(new ArrayList<Integer>());
int level_size = qu.size();
// 遍历当前层次的节点
while(level_size!=0){
//前取后放
if(!flag){
cur=qu.pollFirst();
res.get(level).add(cur.val);
if(cur.left!=null) qu.addLast(cur.left);
if(cur.right!=null) qu.addLast(cur.right);
//前放后取
}else{
cur=qu.pollLast();
res.get(level).add(cur.val);
if(cur.right!=null) qu.addFirst(cur.right);
if(cur.left!=null) qu.addFirst(cur.left);
}
level_size--;
}
level++;
flag=!flag;
}
return res;
}
}