我有一个关于递归函数和更新函数参数的问题。即,我有两个功能:
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--
时,第二个函数才起作用。是否有人知道为什么会这样?预先谢谢你!
答案 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