给你二叉树的根节点
root
,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
中等难度,这道题实际上就是102. 二叉树的层序遍历的变种,先学会了102,那么这道题就简单了。
既然要实现遍历顺序的交叉,那么我们使用一个boolean的变量作为标志位即可,第一次为true,遍历后改为false,然后再改为true……。true表示从左到右遍历,false表示从右向左遍历。
对于每一层的List,采用LinkedList结构,这样就能通过标志位结合add和addFirst方法实现不同顺序的遍历的效果。
public List<List<Integer>> zigzagLevelOrder( TreeNode root ){
ArrayList<List<Integer>> lists = new ArrayList<>();
if( root == null ){
return lists;
}
LinkedList<TreeNode> nodes = new LinkedList();
nodes.add( root );
boolean flag = true;
while( !nodes.isEmpty() ){
int size = nodes.size();
//采用LinkedList而不是ArrayList
LinkedList<Integer> nums = new LinkedList();
for( int i = 0; i < size; i++ ){
TreeNode node = nodes.removeFirst();
//通过标志位判断,采用达到交替顺序遍历的效果
if( flag ){
nums.add( node.val );
}
else{
//采用addFirst达到从右到左遍历的效果
nums.addFirst( node.val );
}
if( node.left != null ){
nodes.add( node.left );
}
if( node.right != null ){
nodes.add( node.right );
}
}
lists.add( nums );
flag = !flag;
}
return lists;
}