两种功能的区别

时间:2018-08-15 08:17:01

标签: java recursion

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

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--时,第二个函数才起作用。是否有人知道为什么会这样?预先谢谢你!

2 个答案:

答案 0 :(得分:1)

populateArray2中,您首先要访问level[currentLevel]++,然后再将currentLevel的{​​{1}}加1。

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

root.right != null

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

此外,如果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.left都不为空,则您在root.right方法中也完成过两次currentLevel++

我不确定您要使用populateArray2来完成什么工作,但是我只是删除它并坚持使用原来的populateArray2方法。.


编辑:正如 @Simon 所述,我只讨论了两种populateArray方法之间的区别,就像OP的问题一样。我没有提到他的要求的实际解决方法。

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

答案 1 :(得分:0)

您的第二个功能无法正常工作,因为如果Node同时具有LEFT和RIGHT元素,则您将增加两次。 因此,您最后需要populateArray