【问题标题】:List vs array as an argument of recursion in java列表vs数组作为java中递归的参数
【发布时间】:2014-01-21 02:28:04
【问题描述】:

我有两种解决方案来打印二叉树中从根到所有叶子的所有路径,如下所示。

在 Sol 1 中,在递归中使用 List 作为参数来添加从根到每个叶节点的路径,然后在从递归返回后,我必须删除一个正在返回的节点。 据我所知,这是因为 List 是一个存储在堆中并被所有人共享的对象。 所以每次递归调用都使用同一个List对象列表,因此需要移除。

但是,在 Sol 2 中,我使用数组作为参数,并且不需要像 List 那样删除返回的节点。我不明白为什么?

根据我的理解,由于数组也是一个对象,存储在堆中并由每个递归调用共享。因此它应该与 List 情况相同,我认为我需要从递归调用中删除返回的节点。但事实并非如此。

你能解释一下为什么递归调用返回的节点不必像 List 那样被删除吗?我对 List case 的理解是否正确?请让我知道这让我很困惑。

解决方案 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**
}

【问题讨论】:

    标签: java arrays list recursion


    【解决方案1】:

    因为索引++。在列表中,您总是获得第一个元素。我的意思是,你总是有 1 个元素,因为你在最后删除了它。在数组中,因为index++,总是得到最后一个元素。

    【讨论】:

    • 我真的很难听懂你想说的话。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-09-30
      • 2019-08-29
      • 1970-01-01
      • 1970-01-01
      • 2013-10-11
      • 2014-06-27
      • 2014-09-18
      • 2018-06-12
      • 2021-09-12
      相关资源
      最近更新 更多