题目描述
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
源代码:
import java.util.ArrayList;
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
import java.util.Queue;
public class Solution {//代码有问题
ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer> > al=new ArrayList<ArrayList<Integer> >();
ArrayList<TreeNode> s1=new ArrayList<TreeNode>(),s2=new ArrayList<TreeNode>();
if(pRoot==null) return al;
s1.add(pRoot);
while(s1.size()!=0){
s2=s1;
s1.clear();
ArrayList<Integer> list=new ArrayList<Integer>();
while(s2.size()!=0){
TreeNode node=s2.get(0);
s2.remove(0);
list.add(node.val);
if(node.right!=null) s1.add(node.right);
if(node.left!=null) s1.add(node.left);
al.add(list);
}
}
return al;
}
}
解法二://正确答案
import java.util.ArrayList;
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
import java.util.ArrayList;
import java.util.Queue;
import java.util.LinkedList;
public class Solution {
ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer> > res=new ArrayList<ArrayList<Integer> >();
ArrayList<Integer> lis=new ArrayList<Integer> ();
Queue<TreeNode> q = new LinkedList<TreeNode>();//建立一个队列来存储二叉树中每一行从左到右的数据
if (pRoot == null)
return res;
int nextcnt=1,cnt=0;
q.offer(pRoot);//先将根结点入栈
while(q.size()!=0){
TreeNode node=q.poll();
cnt++;//对队列中出列的元素计数,每抛出一个元素,计数值加1
if(node.left!=null)
q.offer(node.left);
if(node.right!=null)
q.offer(node.right);
lis.add(node.val);//将每一层节点的值添加到数组链表中
if(cnt==nextcnt){//当队列中抛出的元素个数等于该层的元素个数时,获取下一层的元素个数,把计数变量清零,同时把当前层的元素值的列表添加到数组列表中;
nextcnt=q.size();
cnt=0;
res.add(lis);
lis=new ArrayList<Integer> ();//把数组列表内容清零
}
}
return res;
}
}