鱼C论坛

 找回密码
 立即注册
查看: 1771|回复: 4

二叉树遍历递归函数用法,有点不懂,求指点

[复制链接]
发表于 2014-11-8 09:34:45 | 显示全部楼层 |阅读模式
20鱼币
本帖最后由 风之残月 于 2014-11-9 22:01 编辑

这里的visit函数为什么能直接显示左孩子和右孩子的int值,这里没有用t->l->n表示,难道这样默认也行?
void visit (int e)
{ printf("%d ",e);
}

void bianli(tree *t,void(*visit)(int)) //函数定义调用函数 需将类型报出,然后用指针*调用
{
if(t!=NULL)
{
printf("%d ",t->n);
bianli(t->l,visit); //left左孩子
bianli(t->r,visit); //right右孩子
下面是全部代码
#include<stdio.h>
#include<malloc.h>
#define NULL 0

typedef struct tree
{
int n;
struct tree *l ,*r,*p; //l 表示左孩子 r 表示右孩子 p表示父亲

}tree;


tree *gen()
{
tree *t;
t=(tree *)malloc(sizeof(tree));
t->p=NULL;
t->l=NULL;
t->r=NULL;
t->n=1;
return t;
}
void visit (int e)
{ printf("%d ",e);
}

void bianli(tree *t,void(*visit)(int)) //函数定义调用函数 需将类型报出,然后用指针*调用
{
if(t!=NULL)
{
printf("%d ",t->n);
bianli(t->l,visit);
bianli(t->r,visit);
}
}

void main()
{
tree *t,*a1,*a2,*a3,*a4;
t=gen();
a1=(tree *)malloc(sizeof(tree)); //建立根节点的左右孩子
t->l=a1; //t指向左孩子
a1->p=t; //a1指向父亲
a1->n=2;
a1->l=NULL;
a1->r=NULL; 

a2=(tree *)malloc(sizeof(tree)); //建立根节点的左右孩子
t->r=a2; //t指向右孩子
a2->p=t; //a2指向父亲
a2->n=3;
a2->l=NULL;
a2->r=NULL; 


a3=(tree *)malloc(sizeof(tree)); //建立根节点的左右孩子
a1->l=a3; //a1指向左孩子
a3->p=a1; //a3指向父亲
a3->n=4;
a3->l=NULL;
a3->r=NULL; 

a4=(tree *)malloc(sizeof(tree)); //建立根节点的左右孩子
a1->r=a4; //a1指向右孩子
a4->p=a1; //a4指向父亲
a4->n=5;
a4->l=NULL;
a4->r=NULL; 

bianli(t,visit);


}

最佳答案

查看完整内容

这是递归调用,你可以看成是,它只是输出了自己的值,然后告诉自己的左子树和右子树,你们也用bianli这个方法来处理自己,之后自己就睡觉去了,等到左子树和右子树各自把自己处理完后再返回到这个上层的bianli中。事实上,左子树和右子树也只是输出了自己的值,然后又分别通知自己的左子树和右子树也同样处理,如此分配,只要能保证最低层的处理是正确的而且能返回,那么上层的结果就是建立在正确结果的基础上的,也就一定是正确的 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-11-8 09:34:46 | 显示全部楼层
这是递归调用,你可以看成是,它只是输出了自己的值,然后告诉自己的左子树和右子树,你们也用bianli这个方法来处理自己,之后自己就睡觉去了,等到左子树和右子树各自把自己处理完后再返回到这个上层的bianli中。事实上,左子树和右子树也只是输出了自己的值,然后又分别通知自己的左子树和右子树也同样处理,如此分配,只要能保证最低层的处理是正确的而且能返回,那么上层的结果就是建立在正确结果的基础上的,也就一定是正确的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-11-8 11:43:11 | 显示全部楼层
fireofsun 发表于 2014-11-8 09:34
这是递归调用,你可以看成是,它只是输出了自己的值,然后告诉自己的左子树和右子树,你们也用bianli这个方 ...

其实我想问的是这里的VISIT函数到底有没有用,经过我刚才的测试,删除了visit函数后程序一样执行。。。
帮我想想是不是多余的。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-11-8 15:11:47 | 显示全部楼层
漠水 发表于 2014-11-8 11:43
其实我想问的是这里的VISIT函数到底有没有用,经过我刚才的测试,删除了visit函数后程序一样执行。。。
...

这里visit的用处就是访问当前节点的内容,这里只是简单的输出数值,但真正开发的时候,节点里不可能就那么点数值,对于节点的访问也可能是很复杂的处理,这就只需要将visit的内容给替换掉就行了。去掉visit程序一样执行,但是如果不访问节点,遍历还有什么意思呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-11-8 18:32:35 | 显示全部楼层
fireofsun 发表于 2014-11-8 15:11
这里visit的用处就是访问当前节点的内容,这里只是简单的输出数值,但真正开发的时候,节点里不可能就那 ...

差不多懂了,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-25 07:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表