雪月圣雕 发表于 2021-3-23 09:25:29

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

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

雪月圣雕 发表于 2021-3-23 09:34:00

已发现错误:第31行,*p = T; 改为:*p = f; 原因:见代码注释3
页: [1]
查看完整版本: 求大佬帮帮忙:二叉排序树的插入问题!!!