首先二叉树的一级指针递归创建,话不多说直接给出源码
#include <stdio.h>
#include <stdlib.h>
struct node
{
char data;
node *Lchild;
node *Rchild;
}tree;
node *creattree(node *l)
{
char ch;
scanf("%c",&ch);
//输入#代表终止
if(ch=='#')
{
l=NULL;
}
else
{
l=(node *)malloc(sizeof(node));
l->data=ch;
l->Lchild=creattree(l->Lchild);
l->Rchild=creattree(l->Rchild);
}
return l;
}
int main()
{
node *l;
l=&tree;
printf("请输入:");
creattree(l);
}
这里可以有两种输入方式,第一种输入方式为直接输入一串字符,中间没有空格
下面是运行结果图
第二种是输入完一个敲一个回车,但是对应代码有一点点不同
#include <stdio.h>
#include <stdlib.h>
struct node
{
char data;
node *Lchild;
node *Rchild;
}tree;
node *creattree(node *l)
{
char ch;
printf("请输入:");
scanf("%c",&ch);
getchar();
//输入#代表终止
if(ch=='#')
{
l=NULL;
}
else
{
l=(node *)malloc(sizeof(node));
l->data=ch;
l->Lchild=creattree(l->Lchild);
l->Rchild=creattree(l->Rchild);
}
return l;
}
int main()
{
node *l;
l=&tree;
l=creattree(l);
}
下面是运行结果图
通过运行结果讲一下思路
首先从主函数进入creattree函数,这时我们处于第一世界输入根结点的数据,然后将这个值赋给l开辟的结点里去,再次调用这个函数对根结点的左孩子l->Lchild进行输入,这个时候我们可以说是进入了第二个世界,也就是第一个世界的里世界,以l->Lchild为形参(也就是说此时形参l为l->Lchild),再次调用这个函数进行l->Lchild->Lchild的输入,这个时候我们也由此进入了第三世界,也就是第二世界的里世界,我们输入#,这个结点会被判为空,接着跳到下一个语句return l,l为l->Lchild->Lchild,这时我们退出了第三世界,回到了第二世界,并将它赋给l->Lchild->Lchild,然后再调用这个函数进行的是l->Rchild->Rchild的输入,我们也输入#得到空结点,并赋给l->Rchild->Rchild,接着进行下一个return l,此时的l为l->Lchild,我们也由此回到了第一世界,进入l->Rchild的数据输入,也由此进入到了第二世界,再调用这个函数对l->Rchild->Lchild进行输入,同时进入到了第三世界,然后return l,l为l->Rchild->Lchild,回到第二世界,接着再次调用这个函数进行l->Rchild->Rchild的输入,然后return l,l为l->Rchild->Rchild,回到第二世界,然后return l,l为l->Rchild,回到第一世界,最后再return l,l为根结点l结束这个函数并把l赋给主函数里的l
以上就是该函数递归的思路
如果觉得我讲的很复杂,或者有什么不好的地方,可以去自己调试一下,这样可能印象更加深刻一些,可能能更好的理解