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]]
本文详细解析了二叉树从下往上层次遍历的代码实现,并深入探讨了因List引用导致的输出错误。通过修改List创建位置,解决了同一引用覆盖的问题,确保了正确输出每一层节点。
2773

被折叠的 条评论
为什么被折叠?



