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