鱼C论坛

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

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

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

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

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

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

#define FALSE 0
#define TRUE 1

typedef struct BiTNode
{
        int data;
        struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;

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

/*
        1.递归遍历二叉树,有没有key
        2.如果有,则返回TRUE,并令p指向找到的结点。 
        3.如果没有,则返回FALSE,并令p指向查找路径上失败结点的父结点
        4.如果T为空,那么返回FALSE,并令p指向T。 
        @param1:T是二叉树。
        @param2:f为T的双亲结点指针,初始为NULL。
        @param3:key为待查结点的data值。
        @param4:p是查找指针,执行查找过程。 
        注意:由于f、p、s都要接收或者链接T,所以类型必须一致都为BiTree 
*/
int SearchBST(BiTree T, BiTree f, int key, BiTree *p)
{
        if(!T)//查找不成功 
        {
                *p = T;
                return FALSE;
        }
        else if(T->data == key)        //查找成功 
        {
                *p = T; 
                return TRUE;
        }
        else if(T->data > key)
        {
                SearchBST(T->lchild, T, key, p);        //p内存放的是外部实参p的地址 
        }
        else if(T->data < key)
        {
                SearchBST(T->rchild, T, key, p);
        }
}


/*
        二叉排序树的插入:
        1.首先判断:二叉排序树中有没有相应结点。如果有:返回FALSE;如果没有,申请空间存放key并将其插入到失败结点的父结点之后。
        2.其次判断:二叉排序树是否为空(可用p来判断),若为空,则令新结点作为根结点。 
*/
int InsertBST(BiTree *T, int key)
{
        BiTree s, p;
        
        if(!SearchBST(*T, NULL, key, &p))        //如果没有该结点 
        {
                s = (BiTree)malloc(sizeof(BiTNode));
                s->data = key;
                s->lchild = NULL;
                s->rchild = NULL;
                
                if(!p)        //p为空结点时:树为空树 
                {
                        *T = s;
                }
                else if(key > p->data)
                {
                        p->rchild = s;
                }
                else
                {
                        p->lchild = s;
                }
                return TRUE;
        }
        else        //如果节点存在 
        {
                return FALSE;
        }
}

int main(void)
{
        BiTree T;
        BiTree p;
        int key, ch;
        
        T = NULL;
        p = NULL;
        
        printf("操作指南:\n");
        printf("1,代表插入\n");
        printf("2,代表查找\n");
        printf("0,代表结束\n");
        
        printf("请输入操作指令:");
        scanf("%d", &ch);
                
        while(ch)
        {
                
                switch(ch)
                {
                        case 1:
                                printf("请输入待插入的值:");
                                scanf("%d", &key);
                                if(InsertBST(&T, key))
                                {
                                        printf("插入成功!\n");
                                }
                                else
                                {
                                        printf("插入失败!\n");
                                }
                                break;
                        case 2:
                                printf("请输入待查找的值:");
                                scanf("%d", &key);
                                if(SearchBST(T, NULL, key, &p))
                                {
                                        printf("查找%d成功\n", p->data); 
                                }
                                else
                                {
                                        printf("查找%d失败\n", key);
                                }
                                break;
                        default:
                                break;
                }
                
                printf("请输入操作指令:");
                scanf("%d", &ch);
        
        }
        
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-3-23 09:34:00 | 显示全部楼层
已发现错误:第31行,*p = T; 改为:*p = f; 原因:见代码注释3
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-25 15:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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