首页 新闻 会员 周边

二叉树中附设的指针t的移动路径

0
悬赏园豆:5 [已解决问题] 解决于 2018-11-22 12:42

请教大神帮忙
这是先序遍历二叉树的一个子函数,请举例画图指出指针t分别指向哪些元素
void preorder(BinTNode *t)
{
if(t!=NULL)
{
printf("%3c",t->data);
preorder(t->lchild); //当某个节点没有左孩子时,指针指向哪个元素
preorder(t->rchild);
}
}

代码的灵魂的主页 代码的灵魂 | 初学一级 | 园豆:174
提问于:2018-11-20 15:58
< >
分享
最佳答案
0

递归函数展开来理解

收获园豆:5
绿筱 | 菜鸟二级 |园豆:214 | 2018-11-21 15:25

你好,请问。当e无左右孩子时,第一次递归结束了,此时 t 的值为NULL,然后t又是怎么指向b节点的,再执行preorder(t->rchild);语句的,从而使指针t又指向节点 f 的?简单来说,就是指针如何从NULL值变成指向节点f ?

代码的灵魂 | 园豆:174 (初学一级) | 2018-11-21 19:15

@代码的灵魂:
当t指向b节点时,此时b节点的左孩子是e,右孩子是f。preorder(t->lchild); t->lchild是e,preorder(t->rchild); t->rchild是f。
当执行preorder(t->lchild)语句时,t指向了b的左孩子e,因为e的左孩子和右孩子都为null,所以在t指向e的preorder中,preorder(t->lchild)和preorder(t->rchild)都相当于preorder(null)。e执行完了其实就相当于preorder(t->lchild)执行完了(此时t指向b,t->lchild指向e),返回上一层,也就是t指向b节点的时候,执行preorder(t->rchild)语句。
递归函数的概念在C语言里有讲,这里二叉树是数据结构中的,数据结构一般在C语言之后讲,你可以回头去看看C语言的递归函数和指针。
这个例子可以用入栈出栈来理解递归,t指向a,a入栈,输出a之后,访问a的左孩子,a有左孩子b,接下来t指向b,b入栈,输出b之后,访问b的左孩子,b有左孩子e,接下来t指向e,e入栈,输出e之后,访问e的左孩子,e无左孩子,接下来访问e的右孩子,e无右孩子,e的左右孩子都访问完了,接下来e出栈,此时栈顶是b,此时t指向b,先前b的左孩子已经访问了,接着访问b的右孩子,b有右孩子f,t指向f,f入栈,输出f之后,访问f的左孩子,f无左孩子,接下来访问f的右孩子,f无右孩子,f的左右孩子都访问完了,接下来f出栈。此刻b的左右孩子都访问完了,b出栈。此时栈顶是a,此时t指向a,接下来访问a的右孩子(a的左孩子已经访问过了),a有右孩子c,t指向c,c入栈,输出c之后,访问c的左孩子,c无左孩子,访问c的右孩子,c无右孩子,c出栈,此时栈顶是a,a的左右孩子访问完了,a出栈,栈空了,遍历完毕。

绿筱 | 园豆:214 (菜鸟二级) | 2018-11-21 20:27

@绿筱: 好的,非常感谢

代码的灵魂 | 园豆:174 (初学一级) | 2018-11-22 12:41
其他回答(2)
0

这有什么难的?你为什么不会?哪里没有理解呀?

“当某个节点没有左孩子时,指针指向哪个元素“,哪也不指了,NULL了

会长 | 园豆:12401 (专家六级) | 2018-11-20 16:03
0

这是个简单的递归先序遍历二叉树啊,没有左孩子时就去找右孩子了啊

shakerChann | 园豆:235 (菜鸟二级) | 2018-11-20 20:33
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册