以下是查找树大小的片段。在每次递归调用时计算leftCount和rightCount值。我基本理解递归(这是每个调用进入堆栈并在调用函数完成时返回)但是我不能在这个片段中看到。有人告诉我怎么样?
public static int size(Node node){
int leftCount = node.left == null ? 0 : size(node.left);
int rightCount = node.right == null ? 0 : size(node.right);
return 1+leftCount+rightCount;
}
编辑:我理解递归说return n * fact(n-1)
。但是在上面的代码片段中有两个变量,它们的return语句都使用了这两个变量,所以对我来说很难理解。如果这个太宽泛了解释任何人都可以发布一个类似情况的简单例子(使用两个变量)。
答案 0 :(得分:0)
很难解释,但我会尝试这样做。使用调试器可能会提供更多的洞察力。
对于这个解释,我们假设一棵树的大小为3.根,左节点和右节点。
您可以在树的根上调用方法size()
。现在它将检查是否存在左节点,这是这种情况,因此在左节点上调用该方法。在这种情况下,左节点内的leftCount
将为0,因为此节点没有左节点。 rightCount
也会发生同样的情况,因为在我们的情况下,根的左节点没有正确的节点。现在我们回到根节点上调用的方法。在这种情况下,leftCount
为1,因为我们返回了1 + 0 + 0。对于正确的节点,同样的事情会发生。它将返回1 + 0 + 0,这意味着rightCount
将为1.在最后一行,我们返回1 + 1 + 1(这是正确的)。这些是计算出的尺寸。
这是一个基本的例子,但我认为如果你先了解一个简单的案例,你可以更好地理解这种方法是如何工作的。
编辑:可以找到解释此概念的视频here。视频中的人具有重音,但此人向您解释类似的代码。
答案 1 :(得分:0)
我怀疑你可能会受到这种语法的困扰,因为它通常不会被教授,而且我知道我的团队中有几个高级Java人员,只要他们看到这样的人就必须停下来并精神上一步:/ p>
int leftCount = node.left == null ? 0 : size(node.left);
这相当于:
int leftCount;
if (node.left == null) {
leftCount = 0;
}
else
leftCount = size(node.left)