public class Solution {
public List<List<Integer>> levelOrderBottom(TreeNode root) {
List<Integer> list=new LinkedList<Integer>();
List<List<Integer>> res=new ArrayList<List<Integer>>();
if(root==null) return res;
Queue<TreeNode> queue=new LinkedList<TreeNode>();
queue.offer(root);
while(!queue.isEmpty()){
int size=queue.size();
for(int i=0;i<size;i++){
TreeNode temp=queue.poll();
list.add(temp.val);
if(temp.left!=null)queue.offer(temp.left);
if(temp.right!=null)queue.offer(temp.right);
}
res.add(0,list);
System.out.print(res);
list.clear();
}
return res;
}
}
这是一棵二叉树[3,9,20,null,null,15,7]
从下往上层次遍历的代码,它的输出是[[3]][[9, 20], [9, 20]][[15, 7], [15, 7], [15, 7]],这是因为事实上,这和list引用数据类型地址有关,由于list存放的是一个对象的地址,而不是这个对象的值,所以当对象更新之后,之前加入res对象的list的值会因为list的对象更新,但对象地址没有发生变化,所以当res遍历的时候,由于是存放的地址,我们会取到同一个list对象,而对象的值也更新成了最后一个循环所赋的值。更新为如下代码就没有问题:
public class Solution {
public List<List<Integer>> levelOrderBottom(TreeNode root) {
List<List<Integer>> res=new ArrayList<List<Integer>>();
if(root==null) return res;
Queue<TreeNode> queue=new LinkedList<TreeNode>();
queue.offer(root);
while(!queue.isEmpty()){
List<Integer> list=new ArrayList<Integer>();
int size=queue.size();
for(int i=0;i<size;i++){
TreeNode temp=queue.poll();
list.add(temp.val);
if(temp.left!=null)queue.offer(temp.left);
if(temp.right!=null)queue.offer(temp.right);
}
res.add(0,list);
System.out.print(res);
}
return res;
}
}
输出[[3]][[9, 20], [3]][[15, 7], [9, 20], [3]]