KKK735 2021-12-20 00:22 采纳率: 75%
浏览 25
已结题

删除二叉排序树的一个节点

问题遇到的现象和发生背景

在用C语言编写二叉排序树的删除函数,输入数据为20 60 10 50,45、30,55和70和25,再调用删除函数Delete删除data为20的结点,最后中序遍历输出删除后的二叉排序树,但是只打印了头两个数据,为什么?

问题相关代码,请勿粘贴截图
#include <stdlib.h>
#include <stdio.h>
typedef int ElemType;
#define OK 1

typedef struct Node
{    ElemType data;
    struct Node *lchild;
    struct Node *rchild;
}BiTNode,*BiTree;
void insert(BiTree &bst,int key)
{
    BiTree p;
    if (bst==NULL)
    {
        p=(BiTree)malloc(sizeof(BiTNode));
        p->data=key;
        p->lchild=NULL;
        p->rchild=NULL;
        bst=p;
    }
    else 
        if (key<bst->data)
            insert(bst->lchild,key);
        else
            if (key>bst->data)
                insert(bst->rchild,key);
}

void creattree(BiTree &bst)
{
int key;
bst=NULL;
printf("请输入若干个元素的关键字,中间用空格分隔,以-1表示结束:\n");
scanf("%d",&key);
while (key!=-1)
 {
    insert(bst,key);
    scanf("%d",&key);
  }
}

BiTree search(BiTree bst,int key)
{
    if (bst==NULL)
       return NULL;
    else
        if (bst->data==key)
             return bst;
        else
            if (key<bst->data)
               return search(bst->lchild,key);
            else
               return search(bst->rchild,key);

}
BiTree FindMin(BiTree &t){
    if(t!=NULL){
        while(t->lchild !=NULL){
            t=t->lchild ;
        }
    }
    return t;
}
BiTree FindMax(BiTree &t){
    if(t!=NULL){
        while(t->rchild !=NULL){
            t=t->rchild ;
        }
    }
    return t;
}
void DeleteMin(BiTree &t){
    if(t==NULL){
        printf("EMPTY TREE!");
        return ;
    }
    else if(t->lchild !=NULL){
        DeleteMin(t->lchild );
    }
    else if(t->lchild ==NULL){
        BiTNode *tmp=t;
        t=t->rchild ;
        delete tmp;
    }
}
void Delete(BiTNode * &t,int key){
    if(t==NULL){
        printf("该数据不存在,无法删除!");
        return ;
    }
    if(key<t->data ) Delete(t->lchild,key);
    else if(key>t->data ) Delete(t->rchild,key);
    else if(t->lchild !=NULL&&t->rchild !=NULL){
        printf("查找成功,将元素从二叉排序树中删除!\n");
        printf("被删除的元素为:%d",t->data );
        t->data =FindMin(t->rchild )->data ;
        DeleteMin(t->rchild );
    }
    else {
        BiTNode *tmp=t;
        t=(t->lchild !=NULL)?t->lchild :t->rchild ;
        printf("查找成功,将元素从二叉排序树中删除!\n");
        printf("被删除的元素为:%d",tmp->data);
        delete tmp;
    }
}
ElemType InOrderTraverse(BiTree T) { 
    if(T){
    InOrderTraverse(T->lchild);
    printf("%d ",T->data);
    InOrderTraverse(T->rchild);
    }
    return OK;
}


int main(){

    BiTree bst,pd;

    ElemType num;

    creattree(bst);

    printf("中序遍历二叉排序树的结果如下:\n");

    InOrderTraverse(bst); 

    printf("\n请输入要查找的元素值:");

    scanf("%d",&num);

    pd=search(bst,num);

    if(!pd){

        printf("查找失败,将元素插入二叉排序树!\n");

        insert(bst,num);

        printf("再次中序遍历二叉排序树!\n");

        InOrderTraverse(bst); 

    }
    else printf("该数据存在二叉排序树中!");

    printf("\n请输入要查找的元素值:");

    scanf("%d",&num);

    Delete(bst,num);

    printf("\n再次中序遍历二叉排序树!\n");

    InOrderTraverse(bst);
    
    printf("\n");

    return 0;
}

运行结果及报错内容

img

我的解答思路和尝试过的方法
我想要达到的结果
  • 写回答

1条回答 默认 最新

  • 关注

    BiTree FindMin(BiTree &t){ 去掉& ,t不要用引用型变量,否则 t=t->lchild ;对t赋值时,函数外的实参也会改变
    FindMax() 函数同样

    你题目的解答代码如下:

    #include <stdlib.h>
    #include <stdio.h>
    typedef int ElemType;
    #define OK 1
    typedef struct Node
    {    ElemType data;
        struct Node *lchild;
        struct Node *rchild;
    }BiTNode,*BiTree;
    void insert(BiTree &bst,int key)
    {
        BiTree p;
        if (bst==NULL)
        {
            p=(BiTree)malloc(sizeof(BiTNode));
            p->data=key;
            p->lchild=NULL;
            p->rchild=NULL;
            bst=p;
        }
        else 
            if (key<bst->data)
                insert(bst->lchild,key);
            else
                if (key>bst->data)
                    insert(bst->rchild,key);
    }
    void creattree(BiTree &bst)
    {
    int key;
    bst=NULL;
    printf("请输入若干个元素的关键字,中间用空格分隔,以-1表示结束:\n");
    scanf("%d",&key);
    while (key!=-1)
     {
        insert(bst,key);
        scanf("%d",&key);
      }
    }
    BiTree search(BiTree bst,int key)
    {
        if (bst==NULL)
           return NULL;
        else
            if (bst->data==key)
                 return bst;
            else
                if (key<bst->data)
                   return search(bst->lchild,key);
                else
                   return search(bst->rchild,key);
    }
    BiTree FindMin(BiTree t){  //去掉& ,t不要用引用型变量,否则  t=t->lchild ;对t赋值时,函数外的实参也会改变
        if(t!=NULL){
            while(t->lchild !=NULL){
                t=t->lchild ;
            }
        }
        return t;
    }
    BiTree FindMax(BiTree t){  //去掉& ,t不要用引用型变量
        if(t!=NULL){
            while(t->rchild !=NULL){
                t=t->rchild ;
            }
        }
        return t;
    }
    void DeleteMin(BiTree &t){
        if(t==NULL){
            printf("EMPTY TREE!");
            return ;
        }
        else if(t->lchild !=NULL){
            DeleteMin(t->lchild );
        }
        else if(t->lchild ==NULL){
            BiTNode *tmp=t;
            t=t->rchild ;
            delete tmp;
        }
    }
    void Delete(BiTNode * &t,int key){
        if(t==NULL){
            printf("该数据不存在,无法删除!");
            return ;
        }
        if(key<t->data ) Delete(t->lchild,key);
        else if(key>t->data ) Delete(t->rchild,key);
        else if(t->lchild !=NULL&&t->rchild !=NULL){
            printf("查找成功,将元素从二叉排序树中删除!\n");
            printf("被删除的元素为:%d",t->data );
            t->data =FindMin(t->rchild )->data ;
            DeleteMin(t->rchild );
        }
        else {
            BiTNode *tmp=t;
            t=(t->lchild !=NULL)?t->lchild :t->rchild ;
            printf("查找成功,将元素从二叉排序树中删除!\n");
            printf("被删除的元素为:%d",tmp->data);
            delete tmp;
        }
    }
    ElemType InOrderTraverse(BiTree T) { 
        if(T){
        InOrderTraverse(T->lchild);
        printf("%d ",T->data);
        InOrderTraverse(T->rchild);
        }
        return OK;
    }
     
    int main(){
        BiTree bst,pd;
        ElemType num;
        creattree(bst);
        printf("中序遍历二叉排序树的结果如下:\n");
        InOrderTraverse(bst); 
        printf("\n请输入要查找的元素值:");
        scanf("%d",&num);
        pd=search(bst,num);
        if(!pd){
            printf("查找失败,将元素插入二叉排序树!\n");
            insert(bst,num);
            printf("再次中序遍历二叉排序树!\n");
            InOrderTraverse(bst); 
        }
        else printf("该数据存在二叉排序树中!");
        printf("\n请输入要查找的元素值:");
        scanf("%d",&num);
        Delete(bst,num);
        printf("\n再次中序遍历二叉排序树!\n");
        InOrderTraverse(bst);
        printf("\n");
        return 0;
    }
    

    img

    如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月23日
  • 已采纳回答 12月20日
  • 创建了问题 12月20日

悬赏问题

  • ¥500 火焰左右视图、视差(基于双目相机)
  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本