列表vs数组作为java中递归的参数
我有两种方法可以打印二叉树中从根到所有叶子的所有路径,如下所示
在sol1中,在递归中使用List作为参数来添加从根节点到每个叶节点的路径,然后在从递归返回后,我必须删除正在返回的节点。 据我所知,这是因为列表是一个存储在堆中并由每个人共享的对象。 因此,每个递归调用都使用相同的列表对象列表,因此需要删除
然而,在sol2中,我使用array作为参数,不需要删除返回的节点列表。我不明白为什么
根据我的理解,因为数组也是一个对象,存储在堆中,由每个递归调用共享。因此,它应该与列表情况相同,我认为需要从递归调用中删除返回的节点。但事实并非如此
您能解释一下为什么递归调用返回的节点不必像列表一样被删除吗?我对列表案例的理解是否正确?请让我知道这让我很困惑
解决方案1:递归1-使用列表
void printPathsFromRootToLeavesRec1(BTNode node, List<BTNode> list) {
if(node == null) return;
list.add(node);
// viristed and added node from root --> left subtree --> right subtree
if(node.left == null && node.right == null)
printNodeList(list);
printPathsFromRootToLeavesRec1(node.left, list);
printPathsFromRootToLeavesRec1(node.right, list);
**// Note 1: KEY POINT = Remove after print !!!
list.remove(node);**
}
解决方案2:递归2-使用数组
void printPathFromRootToLeavsRec2(BTNode node, BTNode[] array, int index) {
if(node == null) return;
array[index] = node;
index++;
if(node.left == null && node.right == null) printPathArray(array, index);
printPathFromRootToLeavsRec2(node.left, array, index);
printPathFromRootToLeavsRec2(node.right, array, index);
**// We don't need to remove the returned node in the array case unlike List**
}
# 1 楼答案
因为index++。在列表中,你总是得到第一个元素。我的意思是,你总是有一个元素,因为你在最后移除它。在数组中,因为index++,所以总是得到最后一个元素
# 2 楼答案
因为在数组中,我们只是在下一个函数调用中覆盖元素,所以不需要删除它
请注意,对于
List
,我们正在做一个add
(它总是附加到末尾,显然不会被另一个add
覆盖,因此我们需要一个remove
),但是对于数组,我们只是设置第index
个元素(因此,如果在该位置已经有一个元素,我们只需覆盖它)