题目描述
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
示例1
输入
复制
{8,6,10,5,7,9,11}
返回值
复制
[[8],[6,10],[5,7,9,11]]
import java.util.ArrayList;
import java.lang.*;
import java.util.*;
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
ArrayList<ArrayList<Integer> > Print(TreeNode pRoot)
{
ArrayList<ArrayList<Integer>> result=new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> list=new ArrayList<Integer>();
if(pRoot==null)
return result;
Queue<TreeNode> queue=new LinkedList<TreeNode>();
queue.add(pRoot);
queue.add(new TreeNode(-1));
while(!queue.isEmpty())
{
TreeNode cur=queue.remove();
if(cur.val==-1)
{
if(queue.isEmpty())//不要漏掉特殊情况
{
result.add(list);
break;
}
queue.add(new TreeNode(-1));
result.add((ArrayList<Integer>)list.clone());
list.clear();
//result.add(list);
//list=new ArrayList<Integer>();//新的引用
}
else
{
list.add(cur.val);
if(cur.left!=null)
queue.add(cur.left);
if(cur.right!=null)
queue.add(cur.right);
}
}
return result;
}
}
注:
ArrayList<ArrayList<Integer>> result=new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> list=new ArrayList<Integer>();
ArrayList中存放的也是ArrayList类型,是一种引用类型,因此result中只是存储了对象的引用,引用名为list,所以后续改变list内的值时,result也会跟着发生变化
有三种解决方案:
1、
result.add(new ArrayList<Integer>(list));
list.clear();
2、
result.add((ArrayList<Integer>)list.clone());
list.clear();
3、
result.add(list);
list=new ArrayList<Integer>();
如果不注意是引用类型的话,无论向result内添加多少个元素,他们都指向同一内存地址