Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left to right, level by level from leaf to root).
For example:
Given binary tree {3,9,20,#,#,15,7}
,
3 / \ 9 20 / \ 15 7
return its bottom-up level order traversal as:
[ [3] [9,20], [15,7], ]
ZigZag traversal 就是 第一行 from left to right,the second row is from right to left
return its bottom-up level order traversal as:
[ [3] [20,9], [15,7], ]把这个写到博客是其中有2个处理技巧 非常重要 I never think of these ways to deal with these problems
the first problem: When the queue size changes every time,but we only need the original size how to deal it
the second problem:how to deal with the zigzag traversal(见下面的解释)
int size = queue.size;
for(int i=0;i<size;i++);
while(!queue.isEmpty()) {
ArrayList<Integer> list = new ArrayList<Integer>();
TreeNode node = queue.poll();
for (int i = 0; i < queue.size(); i++) {//如果 node的左孩子和右孩子任意一个不为空的话,queue的size在这里一直 //在变,但是第一次刷这一题的时候 也遇到这个问题,第二次刷的时候,还是遇到这样的问题,所以for循环条件需要改变
list.add(node.val);
if (node.left!= null) {
if (node.left != null) queue.offer(node.left);
}
if(node.right!=null){
if(node.right!=null) queue.offer(node.right);
}
}
result.add(list);
}
zigzag遍历的话 就需要我们设置一个flag 每次循环遍历一个链表之后改变一下flag的值 这段代码可以加在result.add(list)上面 刚开始flag设为true
if(!flag){
Collections.reverse(list);
flag = true;
}else{
flag = false;
}