|
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中。事实上,左子树和右子树也只是输出了自己的值,然后又分别通知自己的左子树和右子树也同样处理,如此分配,只要能保证最低层的处理是正确的而且能返回,那么上层的结果就是建立在正确结果的基础上的,也就一定是正确的 ...
|