我有一个函数,我正在尝试分析它的输出是7:
鉴于此代码块:
int func_1(struct node* node)
{
if (node == NULL)
return 0;
else
return func_1(node->left) + 1 + func_1(node->right);
}
返回值为7。
我知道递归,这里有点简单,我试着跟进,我无法理解它是如何返回的7.我计算它只是向左,向左,然后一次正确,就是这样。它将返回3.即使它在根之后变为3次,它仍将返回6而不是7。
你们可以帮帮我吗?
答案 0 :(得分:3)
从语义上讲,它需要左节点数+ 1(当前节点)+右节点数。
with func_1(x)我的意思是在该特定节点上调用该函数。
所以完整的计算是
此原则在递归中经常使用:
答案 1 :(得分:1)
看一下叶子节点7.
当使用节点7的值调用func_1
时,if语句将分支到else部分,因为指向此节点的指针有效。
然后func_1
将为左孩子召唤两次,为右孩子召唤一次。在这两种情况下,函数返回0,因为左和右子项为NULL。该函数将返回1:
return func_1(node->left) + 1 + func_1(node->right);
相当于:
return func_1(NULL) + 1 + func_1(NULL);
变为:
return 0 + 1 + 0;
答案 2 :(得分:0)
看一下这句话
return func_1(node->left) + 1 + func_1(node->right);
^^^^^
如果节点不等于NULL,则它自身加上相对于该节点的左子树和右子树中的节点数。
因此,您将获得的结果等于不等于NULL的节点数。