鱼C论坛

 找回密码
 立即注册
查看: 2581|回复: 2

关于排序二叉树的插入操作和输出节点的问题

[复制链接]
发表于 2020-2-25 22:42:19 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 Ranbo_ 于 2020-2-25 23:16 编辑

刚学排序二叉树,题目描述这样的:有N个关键字值各不相同的节点,要求按顺序插入一个初始为空树的二叉排序树中,每次插入后成功后,求相应的父亲节点的关键字值,如果没有父亲节点,则输出-1。

我的代码是这样的:
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. typedef struct Node{
  4.     int val;
  5.     struct Node *lchild;
  6.     struct Node *rchild;
  7. }BTNode;
  8. //创建节点
  9. void create(BTNode *T, int value)
  10. {
  11.     T = (BTNode*) malloc(sizeof(BTNode));
  12.     T -> lchild = NULL;
  13.     T -> rchild = NULL;
  14.     T -> val = value;
  15. }
  16. //插入节点,并输出父节点的值
  17. int insert(BTNode *T, int value, int father)//T为当前访问的节点,value是待插入节点的键值,father为当前访问节点的父节点的键值
  18. {
  19.     if(T == NULL)        //若T为空,说明已经找到叶节点,则创建新节点并输出父节点的值
  20.     {
  21.         create(T, value);
  22.         //printf("%d\n", father);
  23.         return father;
  24.     }
  25.     else if(value > T -> val)//若待插键值>当前节点键值,则插入到右子树上
  26.     {
  27.         return insert(T -> rchild, value, T -> val);
  28.         //T -> rchild = insert(T -> rchild, value, T -> val);
  29.     }
  30.     else//若待插键值<当前节点键值,则插入到左子树上
  31.     {
  32.         return insert(T -> lchild, value, T -> val);
  33.         //T -> lchild = insert(T -> lchild, value, T -> val);
  34.     }
  35. }

  36. /*
  37. //后序遍历清空树
  38. void clear(BTNode *p)
  39. {
  40.     clear(p -> lchild);
  41.     clear(p -> rchild);
  42.     free(p);
  43. }
  44. */

  45. int main()
  46. {
  47.     int n;
  48.     int i;
  49.     BTNode *T = (BTNode*) malloc(sizeof(BTNode));
  50.     BTNode *root = T;
  51.     scanf("%d", &n);//n个节点
  52.         scanf("%d", &i);
  53.         root -> val = i;
  54.         root -> lchild = NULL;
  55.         root -> rchild = NULL;
  56.         printf("%d\n", -1);
  57.         int value;
  58.         for(i = 0; i < n - 1; i++)
  59.         {
  60.             T = root;
  61.             //int father = -1;    //初始化储存的父节点的值
  62.             int father;
  63.             scanf("%d", &value);
  64.             father = insert(T, value, -1);
  65.             printf("%d\n", father);
  66.         }
  67.         /*
  68.         BTNode *p = root;
  69.         //后序遍历清空树
  70.         clear(p);
  71.         */
  72.     return 0;
  73. }
复制代码
有一个问题,就是我不管输入啥玩意儿进去它永远都输出的是根节点的值,这是为啥呀


小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-2-25 23:22:38 | 显示全部楼层
一段怎么看怎么别扭的代码。


对指针还没有理解到位, 对树理解还很不足,对递归不理解。

  1. BTNode *T = (BTNode*) malloc(sizeof(BTNode));
  2.        T = NULL; // 这2行代码看着不别扭?
  3. 直接
  4. BTNode *T = NULL不行吗?
复制代码


  1. // 前面看你传father 后面又看你传-1,是我没搞懂你的思维方式? 我觉得father = insert(T, value) 这样够了吧。
  2. father = insert(T, value, father);
  3. father = insert(T, value, -1);
复制代码


  1. // 实现递归的2个基本条件
  2. // -调用函数本身
  3. // -设置了正确的结束条件
  4. int insert(BTNode *T, int value, int father)//T为当前访问的节点,value是待插入节点的键值,father为当前访问节点的父节点的键值
  5. {
  6.     if(T == NULL)        //若T为空,说明已经找到叶节点,则创建新节点并输出父节点的值
  7.     {
  8.         create(T, value);
  9.         //printf("%d\n", father);
  10.         return father;
  11.     }
  12.     else if(value > T -> val)//若待插键值>当前节点键值,则插入到右子树上
  13.     {
  14.         return insert(T -> rchild, value, T -> val);
  15.         //T = insert(T -> rchild, value, T -> val);
  16.     }
  17.     else//若待插键值<当前节点键值,则插入到左子树上
  18.     {
  19.         return insert(T -> lchild, value, T -> val);
  20.         //T = insert(T -> lchild, value, T -> val);
  21.     }
  22. }
复制代码


我的建议 把基础打好,多练习,多打代码;别一头牛似的什么基础都没搞懂就一直冲。。。你这代码跟本没法给你解答,给你改完就以经全不是你的代码了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-26 11:00:15 | 显示全部楼层
  1. #include<stdio.h>
  2. #include<stdlib.h>

  3. typedef struct Node{
  4.     int val;
  5.     struct BTNode *lchild;
  6.     struct BTNode *rchild;
  7. }BTNode;

  8. BTNode* insert(BTNode *T, int value, int *father)//T为当前访问的节点,value是待插入节点的键值,father为当前访问节点的父节点的键值
  9. {
  10.     if(T == NULL)
  11.     {
  12.         T = (BTNode*) malloc(sizeof(BTNode));
  13.         T -> lchild = NULL;
  14.         T -> rchild = NULL;
  15.         T -> val = value;
  16.         return T;
  17.     }
  18.     else if(value > T -> val)
  19.     {
  20.         *father = T -> val;
  21.         T -> rchild = insert(T -> rchild, value, father);
  22.     }
  23.     else
  24.     {
  25.         *father = T -> val;
  26.         T -> lchild = insert(T -> lchild, value, father);
  27.     }
  28.     return T;
  29. }

  30. int main()
  31. {
  32.     BTNode *t = NULL;
  33.     int n;
  34.     int i;
  35.     scanf("%d", &n);//n个节点
  36.     int value;
  37.     for(i = 0; i < n; i++)
  38.     {
  39.         int father = -1;    //初始化储存的父节点的值
  40.         scanf("%d", &value);
  41.         t = insert(t, value, &father);

  42.         printf("%d\n", father);
  43.     }

  44.     return 0;
  45. }

复制代码

重新学习了排序二叉树的构建和函数调用改了一遍终于改出来了,确实是基础超级不行哈,还是得慢慢摸索。我本科生物,只学了数据库技术,对计算机各类语言一点都不了解,考研834数据结构极其简单所以只学了皮毛,复试要笔试算法和机试,前一个多月恶补C语言,现在再写完整代码力不从心,本来就是实操不足哈,再过一个多月就得复试,只能边敲代码便理解了。问的问题确实很蠢,还希望各位不吝赐教哈

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-13 19:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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