鱼C论坛

 找回密码
 立即注册
查看: 1915|回复: 3

关于二叉排序树的创建

[复制链接]
发表于 2021-12-7 19:44:42 | 显示全部楼层 |阅读模式

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

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

x
代码如下:
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #define TRUE 1
  4. #define FALSE 0
  5. //二叉排序树的节点结构定义
  6. typedef struct BiTNode
  7. {
  8.         int data;
  9.         struct BiTNode *lchild, *rchild;
  10. } BiTNode, *BiTree;

  11. void Insert(int num,BiTree *T);
  12. int InsertBST2( BiTree *T, int key );
  13. void construct(BiTree *T);
  14. void destroy(BiTree *T);
  15. //输入

  16. void Insert(int num,BiTree *T)
  17. {
  18.         BiTree p;
  19.         p = (*T);
  20.         while(1)
  21.         {
  22.                 if(!p)
  23.                 {
  24.                         p = (BiTNode*)malloc(sizeof(BiTNode));
  25.                         p->data = num;
  26.                         break;
  27.                 }else if(num >= p->data)
  28.                 {
  29.                         p = p->rchild;
  30.                 }else if(num < p->data)
  31.                 {
  32.                         p = p->lchild;
  33.                 }
  34.         }
  35. }
  36. int InsertBST2( BiTree *T, int key )
  37. {
  38.         /* 当二叉排序树T中不存在关键字等于key的数据元素时 */
  39.         /* 插入key并返回TRUE,否则返回FALSE */
  40.         /* 未调用查找函数,递归插入 */
  41.         if( !(*T) )                                                                        /* 树为空, */
  42.         {
  43.                 (*T) = (BiTree)malloc(sizeof(BiTNode));        /* 这个位置要留心,要重新分配空间,*T为空,说明未曾分配空间 */
  44.                 (*T)->data = key;
  45.                 (*T)->lchild = (*T)->rchild = NULL;
  46.                 return TRUE;
  47.         }
  48.         if( key == (*T)->data )
  49.                 return FALSE;
  50.         if( key > (*T)->data )               
  51.                 return InsertBST2( &((*T)->rchild), key );                /* 插入右孩子 */
  52.         else
  53.                 return InsertBST2( &((*T)->lchild), key );                /* 插入左孩子 */
  54. }

  55. //创建排序树
  56. void construct(BiTree *T)
  57. {
  58.         int j;
  59.         printf("请输入:");
  60.     while(1)
  61.     {
  62.             scanf("%d",&j);
  63.             //Insert(j,T);
  64.             InsertBST2(T,j);
  65.             if(getchar()=='\n')
  66.             {
  67.                     break;
  68.                 }
  69.         }
  70. }

  71. void InTraverse(BiTree T)
  72. {
  73.        
  74.         if(T)
  75.         {
  76.                 InTraverse(T->lchild);
  77.                 printf("%d ",T->data);
  78.                 InTraverse(T->rchild);
  79.         }
  80. }

  81. //销毁树
  82. void destroy(BiTree *T)
  83. {
  84.         if(*T)
  85.         {
  86.                 destroy(&(*T)->lchild);
  87.                 free(*T);
  88.                 destroy(&(*T)->rchild);
  89.         }
  90. }
  91. int main()
  92. {
  93.        
  94.         BiTree T = NULL;       
  95.         construct(&T);
  96.         printf("二叉树递归中序遍历:\n");       
  97.         InTraverse(T);
  98.         destroy(&T);
  99.        
  100.         return 0;
  101. }
复制代码

我是用循环使用插入函数来达到创建的目的,请问下我的Insert插入函数错在哪里?其他地方是没错的,我还特地找了网上别的插入函数来验证,求各位大佬帮帮忙!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-8 16:29:07 | 显示全部楼层
看你创建的代码怪怪的,改了下就行了

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #define TRUE 1
  4. #define FALSE 0
  5. //二叉排序树的节点结构定义
  6. typedef struct BiTNode
  7. {
  8.         int data;
  9.         struct BiTNode *lchild, *rchild;
  10. } BiTNode, *BiTree;

  11. void Insert(BiTree *T,int num);
  12. int InsertBST2( BiTree *T, int key );
  13. void construct(BiTree *T);
  14. void destroy(BiTree *T);
  15. //输入

  16. void Insert(BiTree *T,int num)
  17. {
  18.         BiTree p;
  19.         p = (*T);
  20.         while(1)
  21.         {
  22.                 if(!p)
  23.                 {
  24.                         p = (BiTNode*)malloc(sizeof(BiTNode));
  25.                         p->data = num;
  26.                         break;
  27.                 }else if(num >= p->data)
  28.                 {
  29.                         p = p->rchild;
  30.                 }else if(num < p->data)
  31.                 {
  32.                         p = p->lchild;
  33.                 }
  34.         }
  35. }
  36. int InsertBST2( BiTree *T, int key )
  37. {
  38.         /* 当二叉排序树T中不存在关键字等于key的数据元素时 */
  39.         /* 插入key并返回TRUE,否则返回FALSE */
  40.         /* 未调用查找函数,递归插入 */
  41.         if( !(*T) )                                                                        /* 树为空, */
  42.         {
  43.                 (*T) = (BiTree)malloc(sizeof(BiTNode));        /* 这个位置要留心,要重新分配空间,*T为空,说明未曾分配空间 */
  44.                 (*T)->data = key;
  45.                 (*T)->lchild = (*T)->rchild = NULL;
  46.                 //return TRUE;
  47.         }
  48.         if( key == (*T)->data )
  49.                 return FALSE;
  50.         else if( key > (*T)->data )               
  51.                 return InsertBST2( &((*T)->rchild), key );                /* 插入右孩子 */
  52.         else
  53.                 return InsertBST2( &((*T)->lchild), key );                /* 插入左孩子 */
  54. }

  55. //创建排序树
  56. void construct(BiTree *T)
  57. {
  58.         int j,i,num;
  59.         printf("请输入二叉树关键字数量:");
  60.         scanf("%d",&num);                       
  61.    for(i=1;i<=num;i++)      //构建二叉排序树
  62.    {
  63.                    printf("请输入 %d 个关键字:",j);
  64.             scanf("%d",&j);
  65.             InsertBST2(T,j);
  66.    }
  67.    /* while(1)
  68.     {
  69.             scanf("%d",&j);
  70.             //Insert(j,T);
  71.             InsertBST2(T,j);
  72.             if(getchar()=='\n')
  73.             {
  74.                     break;
  75.                 }
  76.         }*/
  77. }

  78. void InTraverse(BiTree T)
  79. {
  80.         
  81.         if(T)
  82.         {
  83.                 InTraverse(T->lchild);
  84.                 printf("%d ",T->data);
  85.                 InTraverse(T->rchild);
  86.         }
  87. }

  88. //销毁树
  89. void destroy(BiTree *T)
  90. {
  91.         if(*T)
  92.         {
  93.                 destroy(&(*T)->lchild);
  94.                 free(*T);
  95.                 destroy(&(*T)->rchild);
  96.         }
  97. }
  98. int main()
  99. {
  100.         
  101.         BiTree T = NULL;        
  102.         construct(&T);
  103.         printf("二叉树递归中序遍历:\n");        
  104.         InTraverse(T);
  105.         destroy(&T);
  106.         
  107.         return 0;
  108. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-12-8 21:23:40 From FishC Mobile | 显示全部楼层
最强废铁h 发表于 2021-12-8 16:29
看你创建的代码怪怪的,改了下就行了

那个,不是construct函数出问题啦是Insert函数,我这程序运行得出来的,因为我是拿了网上一个Insert函数,就是那个BSTInsert2,只是我换成了我自己写的那个Insert就出错了,我看不出那Insert函数错在哪里
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-12-12 13:21:01 | 显示全部楼层
最后我自己找到原因了。由于不知道怎么删帖,自己也给不了弄不了最佳答案,只能先先搁这了。哪位知道怎么删帖的告诉我一声呗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-13 07:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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