鱼C论坛

 找回密码
 立即注册
查看: 4979|回复: 1

求大佬帮帮忙:二叉排序树的插入问题!!!

[复制链接]
发表于 2021-3-23 09:25:29 | 显示全部楼层 |阅读模式

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

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

x
我根据数据结构与算法#整理 - 庖丁解牛中的代码,完成了一个二叉排序树的插入和查找算法。
但是,我发现插入算法有问题:只能插入一个,如果再次插入会将前一个覆盖。
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. #define FALSE 0
  4. #define TRUE 1

  5. typedef struct BiTNode
  6. {
  7.         int data;
  8.         struct BiTNode *lchild, *rchild;
  9. }BiTNode, *BiTree;

  10. int SearchBST(BiTree T, BiTree f, int key, BiTree *p);
  11. int InsertBST(BiTree *T, int key);

  12. /*
  13.         1.递归遍历二叉树,有没有key
  14.         2.如果有,则返回TRUE,并令p指向找到的结点。
  15.         3.如果没有,则返回FALSE,并令p指向查找路径上失败结点的父结点
  16.         4.如果T为空,那么返回FALSE,并令p指向T。
  17.         @param1:T是二叉树。
  18.         @param2:f为T的双亲结点指针,初始为NULL。
  19.         @param3:key为待查结点的data值。
  20.         @param4:p是查找指针,执行查找过程。
  21.         注意:由于f、p、s都要接收或者链接T,所以类型必须一致都为BiTree
  22. */
  23. int SearchBST(BiTree T, BiTree f, int key, BiTree *p)
  24. {
  25.         if(!T)//查找不成功
  26.         {
  27.                 *p = T;
  28.                 return FALSE;
  29.         }
  30.         else if(T->data == key)        //查找成功
  31.         {
  32.                 *p = T;
  33.                 return TRUE;
  34.         }
  35.         else if(T->data > key)
  36.         {
  37.                 SearchBST(T->lchild, T, key, p);        //p内存放的是外部实参p的地址
  38.         }
  39.         else if(T->data < key)
  40.         {
  41.                 SearchBST(T->rchild, T, key, p);
  42.         }
  43. }


  44. /*
  45.         二叉排序树的插入:
  46.         1.首先判断:二叉排序树中有没有相应结点。如果有:返回FALSE;如果没有,申请空间存放key并将其插入到失败结点的父结点之后。
  47.         2.其次判断:二叉排序树是否为空(可用p来判断),若为空,则令新结点作为根结点。
  48. */
  49. int InsertBST(BiTree *T, int key)
  50. {
  51.         BiTree s, p;
  52.        
  53.         if(!SearchBST(*T, NULL, key, &p))        //如果没有该结点
  54.         {
  55.                 s = (BiTree)malloc(sizeof(BiTNode));
  56.                 s->data = key;
  57.                 s->lchild = NULL;
  58.                 s->rchild = NULL;
  59.                
  60.                 if(!p)        //p为空结点时:树为空树
  61.                 {
  62.                         *T = s;
  63.                 }
  64.                 else if(key > p->data)
  65.                 {
  66.                         p->rchild = s;
  67.                 }
  68.                 else
  69.                 {
  70.                         p->lchild = s;
  71.                 }
  72.                 return TRUE;
  73.         }
  74.         else        //如果节点存在
  75.         {
  76.                 return FALSE;
  77.         }
  78. }

  79. int main(void)
  80. {
  81.         BiTree T;
  82.         BiTree p;
  83.         int key, ch;
  84.        
  85.         T = NULL;
  86.         p = NULL;
  87.        
  88.         printf("操作指南:\n");
  89.         printf("1,代表插入\n");
  90.         printf("2,代表查找\n");
  91.         printf("0,代表结束\n");
  92.        
  93.         printf("请输入操作指令:");
  94.         scanf("%d", &ch);
  95.                
  96.         while(ch)
  97.         {
  98.                
  99.                 switch(ch)
  100.                 {
  101.                         case 1:
  102.                                 printf("请输入待插入的值:");
  103.                                 scanf("%d", &key);
  104.                                 if(InsertBST(&T, key))
  105.                                 {
  106.                                         printf("插入成功!\n");
  107.                                 }
  108.                                 else
  109.                                 {
  110.                                         printf("插入失败!\n");
  111.                                 }
  112.                                 break;
  113.                         case 2:
  114.                                 printf("请输入待查找的值:");
  115.                                 scanf("%d", &key);
  116.                                 if(SearchBST(T, NULL, key, &p))
  117.                                 {
  118.                                         printf("查找%d成功\n", p->data);
  119.                                 }
  120.                                 else
  121.                                 {
  122.                                         printf("查找%d失败\n", key);
  123.                                 }
  124.                                 break;
  125.                         default:
  126.                                 break;
  127.                 }
  128.                
  129.                 printf("请输入操作指令:");
  130.                 scanf("%d", &ch);
  131.        
  132.         }
  133.        
  134.         return 0;
  135. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-3-23 09:34:00 | 显示全部楼层
已发现错误:第31行,*p = T; 改为:*p = f; 原因:见代码注释3
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-8 17:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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