我有一个关于递归函数和更新函数参数的问题。即,我有两个功能:
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]++
,然后如果currentLevel
将root.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.left
和root.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/