给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例如:
给定二叉树 [3,9,20,null,null,15,7]
,
3
/ \
9 20
/ \
15 7
返回锯齿形层次遍历如下:
[
[3],
[20,9],
[15,7]
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*本题思路是与前面差不多,注意的是在反转的难度,但是我们用的Java有反转功能,可以直接用不需要其他操作
*/
class Solution {
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
if(root==null) {
return new ArrayList<>();
}else {
//定义一个嵌套集合存数据
List<List<Integer>> list = new ArrayList<>();
//定义一个队列存放每层遍历的数据
Queue<TreeNode> queue = new LinkedList<>();
//把二叉树添加队列里
queue.add(root);
//定义一个判别层数的变量.来反转
int index=1;
//循环队列
while(!queue.isEmpty()) {
//第一一个单层集合
List<Integer> listTree = new ArrayList<>();
//定义这个一层的长度
int count =queue.size();
for(int i=0;i<count;i++) {
//取出队列第一个结点
TreeNode pNode = queue.poll();
//把值放进集合里
listTree.add(pNode.val);
//左右判断
if(pNode.left !=null){
queue.add(pNode.left);
}
if(pNode.right !=null){
queue.add(pNode.right);
}
}
//这才是这个题重点,在集合里有反转的功能不能用count作为判别
//count是元素个数,需要从新定一个变量
if(index % 2 ==0) {
Collections.reverse(listTree);
}
list.add(listTree);
index++;
}
return list;
}
}
}