题目:从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行
方法一:一个队列实现
先将根节点入队列,需要一个变量记录当前层的结点个数 end=queue.size(),第一次循环end=1;
根节点出队列,根节点有左孩子,左孩子入队列,有右孩子右孩子入队列,完成后队列中有2个节点(假设左右孩子都在),记录当前层的结点个数 end=queue.size(),这两个结点依次出队列,并将其左右孩子入队列,依次循环。
public class Solution {
ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer> > listLevel=new ArrayList<ArrayList<Integer> >();
Queue<TreeNode> queue=new LinkedList<TreeNode>();
if(pRoot==null)
return listLevel;
queue.offer(pRoot);
while(!queue.isEmpty()){
ArrayList<Integer> arrayList=new ArrayList<Integer>();
int lo=0,end=queue.size();
while(lo++<end){
TreeNode node=queue.poll();
arrayList.add(node.val);
if(node.left!=null)
queue.offer(node.left);
if(node.right!=null)
queue.offer(node.right);
}
if(arrayList.size()>0)
listLevel.add(arrayList);
}
return listLevel;
}
}
方法二:两个队列实现
1根结点入queue1
2根节点出queue1,根节点左右孩子入queue2,第一次循环后queue1为空
3queue2中的结点依次出队列,左右孩子入queue1,第二次循环完后queue2为空
4依次交替循环
public class Solution {
ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer> > listLevel=new ArrayList<ArrayList<Integer> >();
Queue<TreeNode> queue1=new LinkedList<TreeNode>();
Queue<TreeNode> queue2=new LinkedList<TreeNode>();
if(pRoot==null)
return listLevel;
queue1.offer(pRoot);
while((!queue1.isEmpty())||(!queue2.isEmpty())){
ArrayList<Integer> arrayList=new ArrayList<Integer>();
while(!queue1.isEmpty()){
TreeNode treeNode = queue1.poll();
arrayList.add(treeNode.val);
if(treeNode.left!=null)
queue2.offer(treeNode.left);
if(treeNode.right!=null)
queue2.offer(treeNode.right);
}
if(arrayList.size()>0)
listLevel.add(arrayList);
arrayList=new ArrayList<Integer>();
//交换两个队列
// listLevel.add(arrayList);
// swap(queue1,queue2);
while(!queue2.isEmpty()){
TreeNode treeNode = queue2.poll();
arrayList.add(treeNode.val);
if(treeNode.left!=null)
queue1.offer(treeNode.left);
if(treeNode.right!=null)
queue1.offer(treeNode.right);
}
if(arrayList.size()>0)
listLevel.add(arrayList);
}
return listLevel;
}