读书人

递归调用的迷惑

发布时间: 2012-08-01 17:53:40 作者: rapoo

递归调用的疑惑
void treeprint(struct tnode *p)
{
if(p!= NULL)
{
treeprint(p->left);
treeprint(p->right);
}

}

这是个二叉树的打印,想问treeprint(p->left)后面的语句每次调用后会执行吗?
也就是调用treeprint(p->left);是一次性调用完后执行treeprint(p->right);
还是每次调用都会执行treeprint(p->right);

[解决办法]
只要还有left,就一次性调用完所有的left,然后倒着一层一层调用right,而调用right时又会以p->right为父节点去遍历其left孩子,就这样
[解决办法]
比如这样的结构
Root
L R
LL LR RL

调用的顺序是这样的。
treeprint(Root)
treeprint(L)
treeprint(LL)
LL->left==NULL返回。
LL->right==NULL返回。
treeprint(LL)返回
treeprint(LR)
LR->left==NULL返回。
LR->right==NULL返回。
treeprint(LR)返回
treeprint(R)
treeprint(RL)
RL->left==NULL返回。
RL->right==NULL返回。
treeprint(RL)返回
R->right==NULL返回。
treeprint(R)返回
treeprint(Root)返回
[解决办法]
先入栈。。根据先进先出的原则调用函数的
[解决办法]
如果非要给个说法,非要总结一下的话就是:对于每一个节点,坚持先左后右的根本原则就好。

探讨

自己找个三级二叉树比画一下就明了

[解决办法]
内层执行完了才执行外层的调用,因此调用过程中堆栈空间先往深处叠加再弹出,这样二叉树才能用作left child、current node、right child的有序排序~
[解决办法]
楼主你自己画个树,然后自己画着执行一下,不就知道了

读书人网 >C语言

热点推荐