打印二叉树,层次遍历的变种,既然是层次遍历,就一定需要用到队列这种数据结构,而且由于要从左到右,从右到左,因此考虑用到标志位和双端队列。
单数行要从左到右打印,起始设置标志位为true,true代表从左到右打印。
而双数行要从右到左打印,所以我们在打印单数行的时候,就要将下一行的添加到队列中,假设我们在打印单数行的时候,对单数行节点的子节点是采用addLast的形式插入的,比如在第一行插入第二行的节点,那么插入完成时队列的数据为[ 9,20 ]
我们在第二行取得时候因为要取出20,所以标志位为false的时候,我们应该removeLast,取出20,而且要保证下一行是从左到右打印的,且我们是双数行,先插入20的右节点7,且此时队列中还有9这个节点,我们是用removeLast取出的,因此要保证9是当前最后一个节点,只能采用addFirst的方法,全部插入完成后,队列结构应该为,[ 15,7 ]
我们第三行还要从左到右打印,因此单数行取出的时候应该为removeFirst,代码如下
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> list = new ArrayList<>();
if(root==null){
return list;
}
Deque<TreeNode> queue = new LinkedList<>();
TreeNode cur = root;
queue.add(root);
boolean flag = true;
while(!queue.isEmpty()){
List<Integer> temp = new ArrayList<Integer>();
if(flag){
for(int i = queue.size();i>0;i--){
TreeNode res = queue.removeFirst();
temp.add(res.val);
if(res.left!=null)
queue.addLast(res.left);
if(res.right!=null)
queue.addLast(res.right);
}
} else{
for(int i = queue.size();i>0;i--){
TreeNode res = queue.removeLast();
temp.add(res.val);
if(res.right!=null)
queue.addFirst(res.right);
if(res.left!=null)
queue.addFirst(res.left);
}
}
list.add(temp);
flag = !flag;
}
return list;
}
}