【发布时间】:2021-07-22 12:02:58
【问题描述】:
请帮助我了解其中的区别。就像在第一个代码 sn-p 中一样,我在第 1 行和第 2 行的递归函数中将更新的 ArrayList 作为参数传递。 这给了我错误的答案。
public static void rootToLeafPaths(TreeNode node, ArrayList<Integer> sub){
if(node == null)
return;
sub.add(node.val);
if(node.left == null && node.right == null){
list.add(sub);
return;
}
rootToLeafPaths(node.left,sub); //LINE 1
rootToLeafPaths(node.right,sub); //LINE 2
sub.remove(sub.size()-1);
}
在第二个代码 sn-p 中,我传递了一个新创建的 ArrayList(在第 3 行和第 4 行),它给了我正确的答案。
public static void rootToLeafPaths(TreeNode node, ArrayList<Integer> sub){
if(node == null)
return;
sub.add(node.val);
if(node.left == null && node.right == null){
list.add(sub);
return;
}
rootToLeafPaths(node.left,new ArrayList<Integer> (sub)); // LINE 3
rootToLeafPaths(node.right,new ArrayList<Integer> (sub)); // LINE 4
sub.remove(sub.size()-1);
}
帮助我了解其中的区别。
这个方法应该提供二叉树的根到叶路径。就像在第一种情况下,它给我 [[1, 2, 4], [1, 2, 4], [1, 2, 4]] 作为输出,这是错误的,但是当我传递一个新创建的 ArrayList 时它给我 [[1, 2, 4, 6, 8], [1, 2, 5, 7, 9, 10], [1, 3]] 作为正确输出的时间
简短摘要(基于答案):即使我们将列表分配给其他列表(例如:列表列表 = 列表 2),我们也会将引用分配给它。所以两者都将指向同一个列表。一个人的变化将反映在另一个人身上。所以为了解决这个问题,我们需要通过 (List list = new ArrayList(list2);) 来创建另一个列表
【问题讨论】:
-
正确答案是什么?该方法应该做什么?
-
@khelwood 这个方法应该提供二叉树的根到叶路径。就像在第一种情况下,它给我 [[1, 2, 4], [1, 2, 4], [1, 2, 4]] 作为输出,这是错误的,但是当我传递一个新创建的 ArrayList 时它给我 [[1, 2, 4, 6, 8], [1, 2, 5, 7, 9, 10], [1, 3]] 作为正确输出的时间。
-
这是您问题中应该包含的信息。
-
@khelwood 谢谢。我现在已经编辑了我的问题。从下次开始,我会在发帖前记住这一点。