C-在遍历二叉树中return是怎样起作用的?例如怎样把原来执行左孩子的递归跳到了执行右孩子递归?
void PreOrderTraverse(BiTree T)
{ if(T==NULL)
return;
printf("%c",T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
你使用的是递归实现,三条语句从宏观上面来看,就是先遍历根结点,然后左子树,然后又子树。对于左子树是先左子树的根节点,然后是左子树的左子树,左子树的右子树。这么循环递归下去的。右子树也是一样的
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);
此时就会调用右孩子,做判断和递归调用。
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); 调用右孩子
应该这样理解你这个程序:
1.打印根节点。
2.如果有左子树,把左节点作为左子树的根节点递归调用该遍历函数。
3.如果有右子树,把右节点作为右子树的根节点递归调用该遍历函数。
这样一来,就可以完成对树的遍历。
左子树是怎么回到右子树的?其实是在递归的过程中,把左子树遍历完了,也就是代码:
PreOrderTraverse(T->lchild);
执行完了之后,自然会执行到下面的这行代码:
PreOrderTraverse(T->rchild);
而这行代码就是遍历右子树的。
所以并不是通过return来从左子树转到右子树的,而只是简单的串行代码的执行,把左子树遍历完了,自然就执行到遍历右子树了。