我有一个关于递归函数和更新函数参数的问题。即,我有两个功能:

public static void populateArray(int[]level,Node root,int currentLevel) {

    currentLevel++;
    if(root.left!=null) {
        populateArray(level,root.left,currentLevel);
    }
    level[currentLevel]++;
    if(root.right!=null) {
        populateArray(level,root.right,currentLevel);
    }

}

public static void populateArray2(int[]level,Node root,int currentLevel) {

        if(root.left!=null) {
            currentLevel++;
            populateArray2(level,root.left,currentLevel);
        }
        level[currentLevel]++;
        if(root.right!=null) {
            currentLevel++;
            populateArray2(level,root.right,currentLevel);
        }

    }


这些函数应在每个级别用一个二进制树中的节点数填充一个空数组。我以为这些函数的工作方式相同,但是事实证明第一个函数正确完成了该任务,而第二个函数没有正确执行,也就是说,从第二个函数的递归调用返回后,currentLevel不会更新,并且我很好奇为什么会这样?
我以为在这两个函数中,当我们从递归调用中返回时,参数将自动更新(第一个函数就是这种情况)。
仅当在每次递归调用之后我们放置currentLevel--时,第二个函数才起作用。是否有人知道为什么会这样?先感谢您!

最佳答案

populateArray2中,您首先要访问level[currentLevel]++,然后如果currentLevelroot.right != null加1。

我已经在您的代码中添加了一些注释以突出显示差异:

public static void populateArray(int[]level,Node root,int currentLevel) {
    currentLevel++; // Increase currentLevel by 1 first
    if(root.left!=null) {
        populateArray(level,root.left,currentLevel);
    }
    level[currentLevel]++; // Increase level by 1 after that
    if(root.right!=null) {
        populateArray(level,root.right,currentLevel);
    }
}

public static void populateArray2(int[]level,Node root,int currentLevel) {
    if(root.left!=null) {
        currentLevel++;
        populateArray2(level,root.left,currentLevel);
    }
    level[currentLevel]++; // Increase level by 1 first
    if(root.right!=null) {
        currentLevel++; // Increase currentLevel by 1 after that
        populateArray2(level,root.right,currentLevel);
    }
}


所以这是关键的区别,由于增加了不同的级别,导致不同的结果。

另外,如果root.leftroot.right都不为null,则您在currentLevel++方法中也完成了populateArray2两次。

我不确定您要使用populateArray2完成什么,但我只是将其删除并坚持使用原始的populateArray方法。



编辑:正如@Simon所提到的,我只解决了两个populateArray方法之间的差异,就像OP的问题一样。我没有提到他的要求的实际解决方案。

See @Simon's answer below for an actual fix following those requirements.

关于java - 两种功能的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51855185/

10-11 21:40