鱼C论坛

 找回密码
 立即注册
查看: 1748|回复: 5

[已解决]这个什么情况,看不出问题在哪里,这个错误提示

[复制链接]
发表于 2023-2-25 12:45:59 | 显示全部楼层 |阅读模式

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

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

x
VWLMU~)YTFRN6DQFS6{B.png
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. typedef int ElemType;

  4. typedef struct BiTNode {//二叉链表
  5.         ElemType data;
  6.         BiTree lchild;        //左指针
  7.         BiTree rchild;        //右指针
  8. } BiTNode, * BiTree;

  9. /*
  10. -二叉排序树:
  11. -若它的左子树不为空, 则左子树上所有结点的值均小于它的根结构的值;
  12. -若它的右子树不为空, 则右子树上所有结点的值大于它的根结构的值;
  13. -它的左、右子树也分别为二叉排序树(递归)。
  14. */

  15. //递归查找二叉排序树T中是否存在key
  16. //若查找成功,则指针p指向该数据元素结点,并返回1
  17. //否则指针p指向查找路径上访问的最后一个结点,并返回0
  18. //f指向T的双亲,初始值值为NULL
  19. int Search_BinarySortTree(BiTree T, int key, BiTree f, BiTree *p) {
  20.         if (!T) {        //查找不成功
  21.                 *p = f;
  22.                 return 0;
  23.         }
  24.         else if (key == T->data) {        //查找成功
  25.                 *p = T;
  26.                 return 1;
  27.         }
  28.         else if (key < T->data) {        //在左子树继续查找
  29.                 return Search_BinarySortTree(T->lchild, key, T, p);
  30.         }
  31.         else {                                                //在右子树继续查找
  32.                 return Search_BinarySortTree(T->rchild, key, T, p);
  33.         }
  34. }

  35. //当二叉排序树T中不存在关键字等于key的数据元素时,插入key并返回1否则返回0
  36. //如果T为NULL;要给T根节点,所以为BiTree *T
  37. int Insert_BinarySortTree(BiTree *T, int key) {
  38.         BiTree p, s;
  39.        
  40.         if (!Search_BinarySortTree(*T, key, NULL, &p)) {
  41.                 s = (BiTree)malloc(sizeof(BiTNode));        //创建一个新的节点
  42.                 s->data = key;
  43.                 s->lchild = s->rchild = NULL;

  44.                 if (!p) {        //说明没有根节点;树为空
  45.                         *T = s;        //插入s为新的根结点
  46.                 }
  47.                 else if (key < p->data) {        //key小于它的的值
  48.                         p->lchild = s;        //s作为左子树
  49.                 }
  50.                 else{        //key大于它的的值
  51.                         p->rchild = s;        //s作为右子树
  52.                 }
  53.                 return 1;
  54.         }
  55.         else{
  56.                 return 0;        //树中已有关键字相同的结点,不再插入

  57.         }
  58. }

  59. //删除二叉排序树T中的key
  60. int Delete_BinarySortTree(BiTree *T, int key) {
  61.         BiTree p;

  62.         if (Search_BinarySortTree(*T, key, NULL, &p)) {        //找到要删除的节点
  63.                 return Delete(&p);
  64.         }
  65.         else {
  66.                 return 0;        //树中找不到节点值为key
  67.         }
  68. }

  69. //删除p节点;使用左子树的最大节点,或右子树的最小节点替换(p节点不为空)
  70. int Delete(BiTree *p){
  71.         BiTree q;        //存放要删除的节点;方便释放内存
  72.         BiTree s;

  73.         if ((*p)->rchild == NULL) {        //右指针为空
  74.                 q = *p;
  75.                 *p = (*p)->lchild;        //将左子树放在要删除的节点位置上
  76.                 free(q);        //释放删除的节点
  77.         }
  78.         else if ((*p)->lchild == NULL) {        //左指针为空
  79.                 q = *p;
  80.                 *p = (*p)->rchild;        //右左子树放在要删除的节点位置上
  81.                 free(q);        //释放删除的节点
  82.         }
  83.         else {        //2个都为空;这里使用直接前驱替换(还可以使用直接后驱)
  84.                 q = *p;
  85.                 s = (*p)->lchild;        //将左子树放在要删除的节点位置上
  86.                 while (s->rchild) {        //找到最右边的子树
  87.                         q = s;        //直接前驱的双亲
  88.                         s = s->rchild;
  89.                 }
  90.                 //因为要保存链接,所以替换数据,删除被替换数据的节点
  91.                 (*p)->data = s->data;        //使用直接前驱的值替换掉p节点的值
  92.                 if (q != p) {        //s是q的右子树,
  93.                         q->rchild = s->lchild;
  94.                 }
  95.                 else{        //q就是p节点,跳过s连接s->lchild
  96.                         q->lchild = s->lchild;
  97.                 }

  98.                 free(s);
  99.         }

  100.         return 1;
  101. }


  102. int main() {
  103.         return 0;
  104. }
复制代码
最佳答案
2023-2-26 03:20:23
第6到10行改成这样
  1. typedef struct BiTNode {//二叉链表
  2.     ElemType data;
  3.     struct BiTNode *lchild;        //左指针
  4.     struct BiTNode *rchild;        //右指针
  5. } BiTNode, * BiTree;
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-2-25 19:25:05 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. typedef int ElemType;

  4. typedef struct BiTNode {//二叉链表
  5.         ElemType data;
  6.         struct BiTNode* lchild;        //左指针
  7.         struct BiTNode* rchild;        //右指针
  8. } BiTNode, * BiTree;

  9. /*
  10. -二叉排序树:
  11. -若它的左子树不为空, 则左子树上所有结点的值均小于它的根结构的值;
  12. -若它的右子树不为空, 则右子树上所有结点的值大于它的根结构的值;
  13. -它的左、右子树也分别为二叉排序树(递归)。
  14. */

  15. //递归查找二叉排序树T中是否存在key
  16. //若查找成功,则指针p指向该数据元素结点,并返回1
  17. //否则指针p指向查找路径上访问的最后一个结点,并返回0
  18. //f指向T的双亲,初始值值为NULL
  19. int Search_BinarySortTree(BiTree T, int key, BiTree f, BiTree *p) {
  20.         if (!T) {        //查找不成功
  21.                 *p = f;
  22.                 return 0;
  23.         }
  24.         else if (key == T->data) {        //查找成功
  25.                 *p = T;
  26.                 return 1;
  27.         }
  28.         else if (key < T->data) {        //在左子树继续查找
  29.                 return Search_BinarySortTree(T->lchild, key, T, p);
  30.         }
  31.         else {                                                //在右子树继续查找
  32.                 return Search_BinarySortTree(T->rchild, key, T, p);
  33.         }
  34. }

  35. //当二叉排序树T中不存在关键字等于key的数据元素时,插入key并返回1否则返回0
  36. //如果T为NULL;要给T根节点,所以为BiTree *T
  37. int Insert_BinarySortTree(BiTree *T, int key) {
  38.         BiTree p, s;

  39.         if (!Search_BinarySortTree(*T, key, NULL, &p)) {
  40.                 s = (BiTree)malloc(sizeof(BiTNode));        //创建一个新的节点
  41.                 s->data = key;
  42.                 s->lchild = s->rchild = NULL;

  43.                 if (!p) {        //说明没有根节点;树为空
  44.                         *T = s;        //插入s为新的根结点
  45.                 }
  46.                 else if (key < p->data) {        //key小于它的的值
  47.                         p->lchild = s;        //s作为左子树
  48.                 }
  49.                 else{        //key大于它的的值
  50.                         p->rchild = s;        //s作为右子树
  51.                 }
  52.                 return 1;
  53.         }
  54.         else{
  55.                 return 0;        //树中已有关键字相同的结点,不再插入

  56.         }
  57. }
  58. //删除p节点;使用左子树的最大节点,或右子树的最小节点替换(p节点不为空)
  59. int Delete(BiTree *p){///////////////////////////////////////////////////////////////////////////////把这个函数放前面调用它的函数前面
  60.         BiTree q;        //存放要删除的节点;方便释放内存
  61.         BiTree s;

  62.         if ((*p)->rchild == NULL) {        //右指针为空
  63.                 q = *p;
  64.                 *p = (*p)->lchild;        //将左子树放在要删除的节点位置上
  65.                 free(q);        //释放删除的节点
  66.         }
  67.         else if ((*p)->lchild == NULL) {        //左指针为空
  68.                 q = *p;
  69.                 *p = (*p)->rchild;        //右左子树放在要删除的节点位置上
  70.                 free(q);        //释放删除的节点
  71.         }
  72.         else {        //2个都为空;这里使用直接前驱替换(还可以使用直接后驱)
  73.                 q = *p;
  74.                 s = (*p)->lchild;        //将左子树放在要删除的节点位置上
  75.                 while (s->rchild) {        //找到最右边的子树
  76.                         q = s;        //直接前驱的双亲
  77.                         s = s->rchild;
  78.                 }
  79.                 //因为要保存链接,所以替换数据,删除被替换数据的节点
  80.                 (*p)->data = s->data;        //使用直接前驱的值替换掉p节点的值
  81.                 if (q != *p) {        //s是q的右子树,///////////////////////////////////////////////////////////
  82.                         q->rchild = s->lchild;
  83.                 }
  84.                 else{        //q就是p节点,跳过s连接s->lchild
  85.                         q->lchild = s->lchild;
  86.                 }

  87.                 free(s);
  88.         }

  89.         return 1;
  90. }
  91. //删除二叉排序树T中的key
  92. int Delete_BinarySortTree(BiTree *T, int key) {
  93.         BiTree p;

  94.         if (Search_BinarySortTree(*T, key, NULL, &p)) {        //找到要删除的节点
  95.                 return Delete(&p);
  96.         }
  97.         else {
  98.                 return 0;        //树中找不到节点值为key
  99.         }
  100. }




  101. int main() {
  102.         return 0;
  103. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-25 19:25:54 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. typedef int ElemType;

  4. typedef struct BiTNode {//二叉链表
  5.         ElemType data;
  6.         struct BiTNode* lchild;        //左指针
  7.         struct BiTNode* rchild;        //右指针
  8. } BiTNode, * BiTree;

  9. /*
  10. -二叉排序树:
  11. -若它的左子树不为空, 则左子树上所有结点的值均小于它的根结构的值;
  12. -若它的右子树不为空, 则右子树上所有结点的值大于它的根结构的值;
  13. -它的左、右子树也分别为二叉排序树(递归)。
  14. */

  15. //递归查找二叉排序树T中是否存在key
  16. //若查找成功,则指针p指向该数据元素结点,并返回1
  17. //否则指针p指向查找路径上访问的最后一个结点,并返回0
  18. //f指向T的双亲,初始值值为NULL
  19. int Search_BinarySortTree(BiTree T, int key, BiTree f, BiTree *p) {
  20.         if (!T) {        //查找不成功
  21.                 *p = f;
  22.                 return 0;
  23.         }
  24.         else if (key == T->data) {        //查找成功
  25.                 *p = T;
  26.                 return 1;
  27.         }
  28.         else if (key < T->data) {        //在左子树继续查找
  29.                 return Search_BinarySortTree(T->lchild, key, T, p);
  30.         }
  31.         else {                                                //在右子树继续查找
  32.                 return Search_BinarySortTree(T->rchild, key, T, p);
  33.         }
  34. }

  35. //当二叉排序树T中不存在关键字等于key的数据元素时,插入key并返回1否则返回0
  36. //如果T为NULL;要给T根节点,所以为BiTree *T
  37. int Insert_BinarySortTree(BiTree *T, int key) {
  38.         BiTree p, s;

  39.         if (!Search_BinarySortTree(*T, key, NULL, &p)) {
  40.                 s = (BiTree)malloc(sizeof(BiTNode));        //创建一个新的节点
  41.                 s->data = key;
  42.                 s->lchild = s->rchild = NULL;

  43.                 if (!p) {        //说明没有根节点;树为空
  44.                         *T = s;        //插入s为新的根结点
  45.                 }
  46.                 else if (key < p->data) {        //key小于它的的值
  47.                         p->lchild = s;        //s作为左子树
  48.                 }
  49.                 else{        //key大于它的的值
  50.                         p->rchild = s;        //s作为右子树
  51.                 }
  52.                 return 1;
  53.         }
  54.         else{
  55.                 return 0;        //树中已有关键字相同的结点,不再插入

  56.         }
  57. }
  58. //删除p节点;使用左子树的最大节点,或右子树的最小节点替换(p节点不为空)
  59. int Delete(BiTree *p){///////////////////////////////////////////////////////////////////////////////把这个函数放前面调用它的函数前面
  60.         BiTree q;        //存放要删除的节点;方便释放内存
  61.         BiTree s;

  62.         if ((*p)->rchild == NULL) {        //右指针为空
  63.                 q = *p;
  64.                 *p = (*p)->lchild;        //将左子树放在要删除的节点位置上
  65.                 free(q);        //释放删除的节点
  66.         }
  67.         else if ((*p)->lchild == NULL) {        //左指针为空
  68.                 q = *p;
  69.                 *p = (*p)->rchild;        //右左子树放在要删除的节点位置上
  70.                 free(q);        //释放删除的节点
  71.         }
  72.         else {        //2个都为空;这里使用直接前驱替换(还可以使用直接后驱)
  73.                 q = *p;
  74.                 s = (*p)->lchild;        //将左子树放在要删除的节点位置上
  75.                 while (s->rchild) {        //找到最右边的子树
  76.                         q = s;        //直接前驱的双亲
  77.                         s = s->rchild;
  78.                 }
  79.                 //因为要保存链接,所以替换数据,删除被替换数据的节点
  80.                 (*p)->data = s->data;        //使用直接前驱的值替换掉p节点的值
  81.                 if (q != *p) {        //s是q的右子树,///////////////////////////////////////////////////////////
  82.                         q->rchild = s->lchild;
  83.                 }
  84.                 else{        //q就是p节点,跳过s连接s->lchild
  85.                         q->lchild = s->lchild;
  86.                 }

  87.                 free(s);
  88.         }

  89.         return 1;
  90. }
  91. //删除二叉排序树T中的key
  92. int Delete_BinarySortTree(BiTree *T, int key) {
  93.         BiTree p;

  94.         if (Search_BinarySortTree(*T, key, NULL, &p)) {        //找到要删除的节点
  95.                 return Delete(&p);
  96.         }
  97.         else {
  98.                 return 0;        //树中找不到节点值为key
  99.         }
  100. }




  101. int main() {
  102.         return 0;
  103. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-26 03:20:23 | 显示全部楼层    本楼为最佳答案   
第6到10行改成这样
  1. typedef struct BiTNode {//二叉链表
  2.     ElemType data;
  3.     struct BiTNode *lchild;        //左指针
  4.     struct BiTNode *rchild;        //右指针
  5. } BiTNode, * BiTree;
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-22 18:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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