我正在使用以下代码进行树的顺序遍历:
void inOrder(struct node* r)
{
if (r==NULL)
return;
else
{
inOrder(r->left);
printf("%d ", r->value);
inOrder(r->right);
}
}
我有这个愚蠢的怀疑:
当最左边的子项以root身份传递时,它不为null。 在下一次迭代中,root将为null(因为最左边的子项的左子项将为null)并且它将遇到return。
这个return语句不会将控件传递给main函数(或者调用它的任何地方)而不打印任何内容?
返回时返回的行为是否有所不同?
答案 0 :(得分:1)
此return
会将控制权传递回当前"层"的位置。调用函数。
函数调用在一个名为stack的结构中组织。想象一下,您的计算机中有一个盒子。计算机可以将一个元素放入框中(在框中的其他元素的顶部),或者它可以删除框顶部的元素。请考虑以下代码。
void f(int x)
{
if (x == 0)
return;
f(x - 1);
}
如果您在主要功能中拨打f(2)
,则计算机会将f(2)
放入该框中。执行f(2)
后,它会在函数内调用f(1)
,因此计算机会将f(1)
放入框中(f(2)
之上)。由于f(1)
也会调用f(0)
,因此计算机会将f(0)
放入框中。
执行f(0)
时,不会调用任何内容,它符合return
指令。因此,计算机会从框中删除f(0)
,而f(1)
现在位于首位。因此,您的计算机知道f(1)
而非main
调用f(0)
,因此它将继续执行f(1)
。 <{1}}返回时的情况相同。
答案 1 :(得分:0)
当最左边的子项以root身份传递时,它不为null。
void inOrder(struct node* r)
{
if (r==NULL)
return;
else{
inOrder(r->left);
printf("%d ", r->value);
inOrder(r->right);
}
}
在上面的代码中,当您将最左边的子项作为root传递时。
首先执行此行
if (r==NULL) return;
由于r
目前不为空,因此会跳过此返回。
在其他部分,它现在将执行
else{
inOrder(r->left);
这里,它再次调用相同的函数,因此,当前执行将暂停一会儿,并在此调用返回时恢复。
现在,inOrder(r->left);
再次使用inOrder(struct node* r);
作为参数null
致电r
。因为,你传递的是r->left
,这是空的。
因此,此inorder
的来电将会点击return
if (r==NULL) return;
当它返回时,它将恢复暂停的inorder
呼叫的最后一个实例
inOrder(r->left);
致电。
这是可能的,因为无论何时从a内部调用函数 函数维持call stack.
现在,恢复后会执行下一行
printf("%d ", r->value);
将在最左下方的节点中打印该值。
最后,它将调用最后一行
inOrder(r->right);
将再次暂停当前函数的执行,并在保存调用堆栈中的当前函数状态后,它将再次调用inorder
为null r->right
,这将再次从
if (r==NULL) return;
最后它会回到inorder
的原始执行并继续执行,因为没有任何指令,如果你从那里调用并恢复main中剩下的内容,它将返回main
方法。
所以,你的答案是它只打印最左边节点的值。
答案 2 :(得分:0)
递归的经典示例可能更好地说明问题
int factorial(int n)
{
if(n == 0)
return 1;
return n * factorial(n - 1);
}
如果我们要调用factorial(3)
,它将递归调用factorial
直到基本情况n == 0
,此时,控制流将返回到调用它的位置, 是factorial(1)
而不是main
。
所以,不,你的return语句会回到调用函数的父节点。