首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

递归调用的迷惑

2012-08-01 
递归调用的疑惑void treeprint(struct tnode *p){if(p! NULL){treeprint(p-left)treeprint(p-right)}

递归调用的疑惑
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的有序排序~
[解决办法]
楼主你自己画个树,然后自己画着执行一下,不就知道了

热点排行