递归调用的疑惑
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)返回
[解决办法]
先入栈。。根据先进先出的原则调用函数的
[解决办法]
如果非要给个说法,非要总结一下的话就是:对于每一个节点,坚持先左后右的根本原则就好。