有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

列表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**
}

共 (2) 个答案

  1. # 1 楼答案

    因为index++。在列表中,你总是得到第一个元素。我的意思是,你总是有一个元素,因为你在最后移除它。在数组中,因为index++,所以总是得到最后一个元素

  2. # 2 楼答案

    因为在数组中,我们只是在下一个函数调用中覆盖元素,所以不需要删除它

    请注意,对于List,我们正在做一个add(它总是附加到末尾,显然不会被另一个add覆盖,因此我们需要一个remove),但是对于数组,我们只是设置第index个元素(因此,如果在该位置已经有一个元素,我们只需覆盖它)