鱼C论坛

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

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

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

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

  4. void bianli(tree *t,void(*visit)(int)) //函数定义调用函数 需将类型报出,然后用指针*调用
  5. {
  6. if(t!=NULL)
  7. {
  8. printf("%d ",t->n);
  9. bianli(t->l,visit); //left左孩子
  10. bianli(t->r,visit); //right右孩子

复制代码

下面是全部代码
  1. #include<stdio.h>
  2. #include<malloc.h>
  3. #define NULL 0

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

  8. }tree;


  9. tree *gen()
  10. {
  11. tree *t;
  12. t=(tree *)malloc(sizeof(tree));
  13. t->p=NULL;
  14. t->l=NULL;
  15. t->r=NULL;
  16. t->n=1;
  17. return t;
  18. }
  19. void visit (int e)
  20. { printf("%d ",e);
  21. }

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

  31. void main()
  32. {
  33. tree *t,*a1,*a2,*a3,*a4;
  34. t=gen();
  35. a1=(tree *)malloc(sizeof(tree)); //建立根节点的左右孩子
  36. t->l=a1; //t指向左孩子
  37. a1->p=t; //a1指向父亲
  38. a1->n=2;
  39. a1->l=NULL;
  40. a1->r=NULL;

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


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

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

  59. bianli(t,visit);


  60. }
复制代码

最佳答案

查看完整内容

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

使用道具 举报

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

使用道具 举报

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

其实我想问的是这里的VISIT函数到底有没有用,经过我刚才的测试,删除了visit函数后程序一样执行。。。
帮我想想是不是多余的。。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

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

使用道具 举报

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

差不多懂了,谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-6 12:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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