请教大神帮忙
这是先序遍历二叉树的一个子函数,请举例画图指出指针t分别指向哪些元素
void preorder(BinTNode *t)
{
if(t!=NULL)
{
printf("%3c",t->data);
preorder(t->lchild); //当某个节点没有左孩子时,指针指向哪个元素
preorder(t->rchild);
}
}
递归函数展开来理解
你好,请问。当e无左右孩子时,第一次递归结束了,此时 t 的值为NULL,然后t又是怎么指向b节点的,再执行preorder(t->rchild);语句的,从而使指针t又指向节点 f 的?简单来说,就是指针如何从NULL值变成指向节点f ?
@代码的灵魂:
当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出栈,栈空了,遍历完毕。
@绿筱: 好的,非常感谢
“当某个节点没有左孩子时,指针指向哪个元素“,哪也不指了,NULL了
这是个简单的递归先序遍历二叉树啊,没有左孩子时就去找右孩子了啊