C-在遍历二叉树中return是怎样起作用的?例如怎样把原来执行左孩子的递归跳到了执行右孩子递归?

发布于 2016-12-20 00:08:54 字数 353 浏览 1397 评论 4

二叉树的示意图

void PreOrderTraverse(BiTree T)
{ if(T==NULL)
return;
printf("%c",T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

瑾兮 2017-10-22 01:08:32

你使用的是递归实现,三条语句从宏观上面来看,就是先遍历根结点,然后左子树,然后又子树。对于左子树是先左子树的根节点,然后是左子树的左子树,左子树的右子树。这么循环递归下去的。右子树也是一样的

甜柠檬 2017-03-03 05:14:36

 void PreOrderTraverse(BiTree T)
{ if(T==NULL)
return;
printf("%c",T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}

1、return起作用,是在递归调用中,到达一个节点假设为A(T),先执行:

  if(T==NULL)
return;

先判断指针是否为空,如果为空,则满足条件,此时,执行return语句返回到上一层调用中。
2、如果1不满足,则会继续向下执行:

 PreOrderTraverse(T->lchild);

此时会调用左孩子,如果不为NULL,则会继续判断和递归调用;如果为NULL,则会返回到上一层去。
3、(接着1)在1中调用左孩子返回上一层后,接下来执行:

 PreOrderTraverse(T->rchild);

此时就会调用右孩子,做判断和递归调用。

偏爱自由 2017-02-21 06:17:00

void PreOrderTraverse(BiTree T)
{ if(T==NULL)
return;
printf("%c",T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}

PreOrderTraverse(T->lchild); 这条语句是递归调用左孩子,
如果还有左孩子那么就会一直递归调用到这条函数调用,直到没有左孩子时,这条调用就会return,接着执行下一条语句 PreOrderTraverse(T->rchild); 调用右孩子

虐人心 2016-12-25 13:43:55

应该这样理解你这个程序:
1.打印根节点。
2.如果有左子树,把左节点作为左子树的根节点递归调用该遍历函数。
3.如果有右子树,把右节点作为右子树的根节点递归调用该遍历函数。
这样一来,就可以完成对树的遍历。
左子树是怎么回到右子树的?其实是在递归的过程中,把左子树遍历完了,也就是代码:

 PreOrderTraverse(T->lchild);

执行完了之后,自然会执行到下面的这行代码:

 PreOrderTraverse(T->rchild);

而这行代码就是遍历右子树的。
所以并不是通过return来从左子树转到右子树的,而只是简单的串行代码的执行,把左子树遍历完了,自然就执行到遍历右子树了。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文