鱼C论坛

 找回密码
 立即注册
查看: 1776|回复: 6

[已解决]关于递归函数二叉树的问题求大佬进来看看

[复制链接]
发表于 2022-12-13 13:54:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 壳970527 于 2022-12-13 14:06 编辑
  1. #include <stdio.h>
  2. #include <stdlib.h>


  3. typedef struct _nd{
  4.         int num;
  5.         struct _nd *left;
  6.         struct  _nd *right;
  7. } NODE;

  8. void mbtree(NODE *p1, int num);

  9. int main(void)
  10. {
  11.         int data[] = {3, 6, 9, 1, 10, 7};
  12.         int i;
  13.         NODE *root, *top;
  14.         int dsize;

  15.         dsize = sizeof(data)/sizeof(int);

  16.         for (i = 0; i < dsize; i++) {
  17.                 printf("%d ", data[i]);
  18.         }
  19.         printf("\n");
  20.         root = (NODE *) malloc(sizeof(NODE));
  21.         if(root == NULL) {
  22.                 printf("can not allocate memory\n");
  23.                 exit(-1);
  24.         }
  25.         root->num = data[0];
  26.         root->left = NULL;
  27.         root->right = NULL;
  28.         top = root;
  29.         printf("root: %d\n", root->num);
  30.         for(i = 1; i < dsize; i++) {
  31.                 printf("i= %d :", i);
  32.                 mbtree(top, data[i]);
  33.         }
  34.         return 0;
  35. }

  36. /* 未完成プログラム */
  37. void mbtree(NODE *p1, int num)
  38. {
  39.         NODE *p2;
  40.         p2 = (NODE *)malloc(sizeof(NODE));
  41.         if(p2 == NULL) {
  42.                 printf("can not allocate memory for mbree\n");
  43.                 exit(-1);
  44.         }
  45.         p2->num = /*ここを完成させよ */;
  46.         p2->left = NULL;
  47.         p2->right = /*ここを完成させよ */;

  48.         /* 値の大小によって左右に振り分ける */
  49.         if (p1->num < num) {    /* 主ノードより大きいとき */
  50.         /* 右がNULLならそこに新たなノードをぶら下げる */
  51.                 if (p1->right == NULL) {
  52.                         p1->right = /*ここを完成させよ */;
  53.                         printf(/*ここを完成させよ */);
  54.                 }
  55.                 else /* NULLでなければ右側のノードに移動 */
  56.                         mbtree(/*ここを完成させよ */);
  57.         } else {
  58.         /* 左がNULLならそこに新たなノードをぶら下げる */
  59.                 /*ここを完成させよ */
  60.         }
  61. }
复制代码

3 6 9 1 10 7
root: 3
i= 1 :(p)3 (r)6
i= 2 :(p)6 (r)9
i= 3 :(p)3 (l)1
i= 4 :(p)9 (r)10
i= 5 :(p)9 (l)7
这是这道题最后输出的内容,我搞不懂p2 = (NODE *)malloc(sizeof(NODE))这个究竟是什么意思,还有就是应该如何把这个函数填完
r的意思是右边,l的意思是左边
最佳答案
2022-12-13 18:12:12
本帖最后由 jhq999 于 2022-12-13 18:14 编辑
  1. #include <stdio.h>
  2. #include <stdlib.h>


  3. typedef struct _nd
  4. {
  5.     int num;
  6.     struct _nd *left;
  7.     struct  _nd *right;
  8. } NODE;

  9. void mbtree(NODE *p1, int num);

  10. int main(void)
  11. {
  12.     int data[] = {3, 6, 9, 1, 10, 7};
  13.     int i;
  14.     NODE *root, *top;
  15.     int dsize;

  16.     dsize = sizeof(data)/sizeof(int);

  17.     for (i = 0; i < dsize; i++)
  18.     {
  19.         printf("%d ", data[i]);
  20.     }
  21.     printf("\n");
  22.     root = (NODE *) malloc(sizeof(NODE));
  23.     if(root == NULL)
  24.     {
  25.         printf("can not allocate memory\n");
  26.         exit(-1);
  27.     }
  28.     root->num = data[0];
  29.     root->left = NULL;
  30.     root->right = NULL;
  31.     top = root;
  32.     printf("root: %d\n", root->num);
  33.     for(i = 1; i < dsize; i++)
  34.     {
  35.         printf("i= %d :", i);
  36.         mbtree(top, data[i]);
  37.     }
  38.     return 0;
  39. }

  40. /* 未完成プログラム */
  41. void mbtree(NODE *p1, int num)
  42. {


  43.     /* 値の大小によって左右に振り分ける */
  44.     if (p1->num < num)      /* 主ノードより大きいとき */
  45.     {
  46.         /* 右がNULLならそこに新たなノードをぶら下げる */
  47.         if (p1->right == NULL)
  48.         {
  49.             NODE *p2;
  50.             p2 = (NODE *)malloc(sizeof(NODE));
  51.             if(p2 == NULL)
  52.             {
  53.                 printf("can not allocate memory for mbree\n");
  54.                 exit(-1);
  55.             }
  56.             p2->num = num;
  57.             p2->left = NULL;
  58.             p2->right = NULL;
  59.             p1->right = p2;
  60.              printf("%d's right is %d\n",p1->num,num);
  61.         }
  62.         else /* NULLでなければ右側のノードに移動 */
  63.             mbtree(p1->right,num);
  64.     }
  65.     else
  66.     {
  67.         if (p1->left == NULL)
  68.         {
  69.             NODE *p2;
  70.             p2 = (NODE *)malloc(sizeof(NODE));
  71.             if(p2 == NULL)
  72.             {
  73.                 printf("can not allocate memory for mbree\n");
  74.                 exit(-1);
  75.             }
  76.             p2->num = num;
  77.             p2->left = NULL;
  78.             p2->right = NULL;
  79.             p1->left = p2;
  80.             printf("%d's left is %d\n",p1->num,num);
  81.         }
  82.         else /* NULLでなければ右側のノードに移動 */
  83.             mbtree(p1->left,num);
  84.     }
  85. }
复制代码
  1. 3 6 9 1 10 7
  2. root: 3
  3. i= 1 :3's right is 6
  4. i= 2 :6's right is 9
  5. i= 3 :3's left is 1
  6. i= 4 :9's right is 10
  7. i= 5 :9's left is 7

  8. Process returned 0 (0x0)   execution time : 0.290 s
  9. Press any key to continue.
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-12-13 15:07:48 | 显示全部楼层
  1. void mbtree(NODE *p1, int num)
  2. {
  3.         NODE *p2;
  4.         p2 = (NODE *)malloc(sizeof(NODE));
  5.         if(p2 == NULL) {
  6.                 printf("can not allocate memory for mbree\n");
  7.                 exit(-1);
  8.         }
  9.         p2->num = num;
  10.         p2->left = NULL;
  11.         p2->right = NULL;
  12.         if (p1->num < num) {
  13.                 if (p1->right == NULL) {
  14.                         p1->right = num;
  15.                         printf("(p)%d (r)%d\n",p1->num,num);
  16.                 }
  17.                 else
  18.                         mbtree(p1->right,num);
  19.         }
  20.         else {
  21.                 if (p1->right == NULL) {
  22.                         p1->left = num;
  23.                         printf("(p)%d (l)%d\n",p1->num,num);
  24.                 }
  25.                 else
  26.                         mbtree(p1->left,num);
  27.         }
  28. }
复制代码

这是我写出来的这个函数,但是不知道为什么只能算到
3 6 9 1 10 7
root: 3
i= 1 :(p)3 (r)6
然后就出错了,请大佬帮忙看看哪里出问题了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-12-13 15:11:59 | 显示全部楼层
这道题的思路是,先从3开始查找下一个数,
3之后是6,6比3大,那么放在3的右边,然后下一个数字是9,9比3大,但是3的右边有数了,需要到6这一层,就递归,然后6这一层比6大,放到6的右边,
再到1,1比3小,3的左边没有,放在3的左边,
再到10,10比3大,可是3的右边有6,到6这一层,比6大,6的右边有9,所以再到9的这一层,比9大,9的右边是null放9的右边,是这样的思路
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-13 17:54:57 | 显示全部楼层
壳970527 发表于 2022-12-13 15:11
这道题的思路是,先从3开始查找下一个数,
3之后是6,6比3大,那么放在3的右边,然后下一个数字是9,9比3 ...
  1. p1->right = num;////编译能通过吗?
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-13 18:12:12 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jhq999 于 2022-12-13 18:14 编辑
  1. #include <stdio.h>
  2. #include <stdlib.h>


  3. typedef struct _nd
  4. {
  5.     int num;
  6.     struct _nd *left;
  7.     struct  _nd *right;
  8. } NODE;

  9. void mbtree(NODE *p1, int num);

  10. int main(void)
  11. {
  12.     int data[] = {3, 6, 9, 1, 10, 7};
  13.     int i;
  14.     NODE *root, *top;
  15.     int dsize;

  16.     dsize = sizeof(data)/sizeof(int);

  17.     for (i = 0; i < dsize; i++)
  18.     {
  19.         printf("%d ", data[i]);
  20.     }
  21.     printf("\n");
  22.     root = (NODE *) malloc(sizeof(NODE));
  23.     if(root == NULL)
  24.     {
  25.         printf("can not allocate memory\n");
  26.         exit(-1);
  27.     }
  28.     root->num = data[0];
  29.     root->left = NULL;
  30.     root->right = NULL;
  31.     top = root;
  32.     printf("root: %d\n", root->num);
  33.     for(i = 1; i < dsize; i++)
  34.     {
  35.         printf("i= %d :", i);
  36.         mbtree(top, data[i]);
  37.     }
  38.     return 0;
  39. }

  40. /* 未完成プログラム */
  41. void mbtree(NODE *p1, int num)
  42. {


  43.     /* 値の大小によって左右に振り分ける */
  44.     if (p1->num < num)      /* 主ノードより大きいとき */
  45.     {
  46.         /* 右がNULLならそこに新たなノードをぶら下げる */
  47.         if (p1->right == NULL)
  48.         {
  49.             NODE *p2;
  50.             p2 = (NODE *)malloc(sizeof(NODE));
  51.             if(p2 == NULL)
  52.             {
  53.                 printf("can not allocate memory for mbree\n");
  54.                 exit(-1);
  55.             }
  56.             p2->num = num;
  57.             p2->left = NULL;
  58.             p2->right = NULL;
  59.             p1->right = p2;
  60.              printf("%d's right is %d\n",p1->num,num);
  61.         }
  62.         else /* NULLでなければ右側のノードに移動 */
  63.             mbtree(p1->right,num);
  64.     }
  65.     else
  66.     {
  67.         if (p1->left == NULL)
  68.         {
  69.             NODE *p2;
  70.             p2 = (NODE *)malloc(sizeof(NODE));
  71.             if(p2 == NULL)
  72.             {
  73.                 printf("can not allocate memory for mbree\n");
  74.                 exit(-1);
  75.             }
  76.             p2->num = num;
  77.             p2->left = NULL;
  78.             p2->right = NULL;
  79.             p1->left = p2;
  80.             printf("%d's left is %d\n",p1->num,num);
  81.         }
  82.         else /* NULLでなければ右側のノードに移動 */
  83.             mbtree(p1->left,num);
  84.     }
  85. }
复制代码
  1. 3 6 9 1 10 7
  2. root: 3
  3. i= 1 :3's right is 6
  4. i= 2 :6's right is 9
  5. i= 3 :3's left is 1
  6. i= 4 :9's right is 10
  7. i= 5 :9's left is 7

  8. Process returned 0 (0x0)   execution time : 0.290 s
  9. Press any key to continue.
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-12-14 00:17:47 | 显示全部楼层

牛逼呀大佬!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-14 00:41:10 | 显示全部楼层

别着急,学完树你就明白了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-19 13:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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