鱼C论坛

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

关于二叉排序树的创建

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

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

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

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

void Insert(int num,BiTree *T);
int InsertBST2( BiTree *T, int key );
void construct(BiTree *T); 
void destroy(BiTree *T);
//输入 

void Insert(int num,BiTree *T)
{
        BiTree p;
        p = (*T);
        while(1)
        {
                if(!p)
                {
                        p = (BiTNode*)malloc(sizeof(BiTNode));
                        p->data = num;
                        break;
                }else if(num >= p->data)
                {
                        p = p->rchild;
                }else if(num < p->data)
                {
                        p = p->lchild;
                }
        }
}
int InsertBST2( BiTree *T, int key )
{
        /* 当二叉排序树T中不存在关键字等于key的数据元素时 */
        /* 插入key并返回TRUE,否则返回FALSE */
        /* 未调用查找函数,递归插入 */
        if( !(*T) )                                                                        /* 树为空, */
        {
                (*T) = (BiTree)malloc(sizeof(BiTNode));        /* 这个位置要留心,要重新分配空间,*T为空,说明未曾分配空间 */
                (*T)->data = key;
                (*T)->lchild = (*T)->rchild = NULL;
                return TRUE;
        }
        if( key == (*T)->data )
                return FALSE;
        if( key > (*T)->data )                
                return InsertBST2( &((*T)->rchild), key );                /* 插入右孩子 */
        else
                return InsertBST2( &((*T)->lchild), key );                /* 插入左孩子 */
} 

//创建排序树 
void construct(BiTree *T)
{
        int j;
        printf("请输入:");
    while(1)
    {
            scanf("%d",&j);
            //Insert(j,T);
            InsertBST2(T,j);
            if(getchar()=='\n')
            {
                    break;
                }
        }
}

void InTraverse(BiTree T)
{
        
        if(T)
        {
                InTraverse(T->lchild);
                printf("%d ",T->data);
                InTraverse(T->rchild);
        }
}

//销毁树
void destroy(BiTree *T)
{
        if(*T)
        {
                destroy(&(*T)->lchild);
                free(*T);
                destroy(&(*T)->rchild);
        }
} 
int main()
{
        
        BiTree T = NULL;        
        construct(&T);
        printf("二叉树递归中序遍历:\n");        
        InTraverse(T);
        destroy(&T);
        
        return 0;
}
我是用循环使用插入函数来达到创建的目的,请问下我的Insert插入函数错在哪里?其他地方是没错的,我还特地找了网上别的插入函数来验证,求各位大佬帮帮忙!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-8 16:29:07 | 显示全部楼层
看你创建的代码怪怪的,改了下就行了
#include<stdio.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
//二叉排序树的节点结构定义
typedef struct BiTNode
{
        int data;
        struct BiTNode *lchild, *rchild;
} BiTNode, *BiTree;

void Insert(BiTree *T,int num);
int InsertBST2( BiTree *T, int key );
void construct(BiTree *T); 
void destroy(BiTree *T);
//输入 

void Insert(BiTree *T,int num)
{
        BiTree p;
        p = (*T);
        while(1)
        {
                if(!p)
                {
                        p = (BiTNode*)malloc(sizeof(BiTNode));
                        p->data = num;
                        break;
                }else if(num >= p->data)
                {
                        p = p->rchild;
                }else if(num < p->data)
                {
                        p = p->lchild;
                }
        }
}
int InsertBST2( BiTree *T, int key )
{
        /* 当二叉排序树T中不存在关键字等于key的数据元素时 */
        /* 插入key并返回TRUE,否则返回FALSE */
        /* 未调用查找函数,递归插入 */
        if( !(*T) )                                                                        /* 树为空, */
        {
                (*T) = (BiTree)malloc(sizeof(BiTNode));        /* 这个位置要留心,要重新分配空间,*T为空,说明未曾分配空间 */
                (*T)->data = key;
                (*T)->lchild = (*T)->rchild = NULL;
                //return TRUE;
        }
        if( key == (*T)->data )
                return FALSE;
        else if( key > (*T)->data )                
                return InsertBST2( &((*T)->rchild), key );                /* 插入右孩子 */
        else
                return InsertBST2( &((*T)->lchild), key );                /* 插入左孩子 */
} 

//创建排序树 
void construct(BiTree *T)
{
        int j,i,num;
        printf("请输入二叉树关键字数量:");
        scanf("%d",&num);                       
   for(i=1;i<=num;i++)      //构建二叉排序树
   {
                   printf("请输入 %d 个关键字:",j);
            scanf("%d",&j);
            InsertBST2(T,j);
   }
   /* while(1)
    {
            scanf("%d",&j);
            //Insert(j,T);
            InsertBST2(T,j);
            if(getchar()=='\n')
            {
                    break;
                }
        }*/
}

void InTraverse(BiTree T)
{
        
        if(T)
        {
                InTraverse(T->lchild);
                printf("%d ",T->data);
                InTraverse(T->rchild);
        }
}

//销毁树
void destroy(BiTree *T)
{
        if(*T)
        {
                destroy(&(*T)->lchild);
                free(*T);
                destroy(&(*T)->rchild);
        }
} 
int main()
{
        
        BiTree T = NULL;        
        construct(&T);
        printf("二叉树递归中序遍历:\n");        
        InTraverse(T);
        destroy(&T);
        
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> 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-11-22 02:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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