本题考查树的 BFS.BFS就是一层一层的遍历,我们用队列实现。一个队列的话我们没有层次的限制,直到这个队列为空,说明我们遍历完了。但是现在我们要记录下每一层的节点。相当于问题转为给定一棵二叉树,麻烦打印一下第n层的所有节点。所以为了让每一层都有明显的分开,我们用两个队列来实现互相保存。 之字形的话无非就是要将其中一个队列反转一下顺序。
可读性来了:
public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer>> res=new ArrayList<>();
LinkedList<TreeNode> list1=new LinkedList<>();
LinkedList<TreeNode> list2=new LinkedList<>();
if(pRoot==null){
return res;
}
list1.add(pRoot);
while(!list1.isEmpty() || !list2.isEmpty()){ //循环交替互相保存遍历的节点
if(!list1.isEmpty()){ //取出我们要的 val
printTreeNode(res,list1,0);
}
while(!list1.isEmpty()){ //遍历下一层
addList(list1,list2);
}
if(!list2.isEmpty()){ //取出我们要的 val
printTreeNode(res,list2,1);
}
while(!list2.isEmpty()){ //遍历下一层
addList(list2,list1);
}
}
return res;
}
public void printTreeNode(ArrayList<ArrayList<Integer>> res,LinkedList<TreeNode> list,int mode){ //好就不写代码了,原来还有 .reverse()方法,就不用遍历了
ArrayList<Integer> listNums=new ArrayList<>();
if(mode==0){
for(TreeNode root:list){
listNums.add(root.val);
}
}else{
for(int i=list.size()-1;i>=0;i--){
listNums.add(list.get(i).val);
}
}
res.add(listNums);
return ;
}
public void addList(LinkedList<TreeNode> list1,LinkedList<TreeNode> list2){
TreeNode root=list1.removeFirst();
if(root.left!=null){
list2.add(root.left);
}
if(root.right!=null){
list2.add(root.right);
}
}

京公网安备 11010502036488号