二叉排序树(新建,插入,查找,删除)(C语言编写)

#include<stdio.h>
#include <stdlib.h>

typedef struct BSTNode{

        int data;

        struct BSTNode *lchild,*rchild;

}BSTNode,*BSTree;

BSTree InsertBST(BSTree T,int data);

BSTree CreatBST(BSTree T);

bool SearchBST(BSTree T,int key);

void DeleteBST(BSTree T,int key);

void PrintBST(BSTree T);

bool DeleteBST(BSTree *T, int key);

bool Delete(BSTree *T);

int main(){
    
    BSTree T;
    
    T=NULL;

    int key;

    bool n;

    printf("请输入数据(输0停止):\n");
    
    T=CreatBST(T);

    do{
    printf("请输入要查找的数据:\n");
   
    scanf("%d",&key);
    
    n=SearchBST(T,key);

    }while(!n);

    printf("请输入要删除的数据:\n");

    scanf("%d",&key);

    DeleteBST(&T,key);
    
    printf("中序显示:\n");
    
    PrintBST(T);
    
    printf("\n");

    return 0;


}

BSTree InsertBST(BSTree T,int data){

       BSTree s;

       if(!T){

             s=(BSTNode *)malloc(sizeof(BSTree));

             s->data=data;

             s->lchild=NULL;

             s->rchild=NULL;

             return s;
       }

       else if(T->data<data){

             T->rchild=InsertBST(T->rchild,data);
       }

       else if(T->data>data){

             T->lchild=InsertBST(T->lchild,data);

       }
       return T;

}

BSTree CreatBST(BSTree T){

      int data;

      scanf("%d",&data);

      while(data!=0){

          T=InsertBST(T,data);

          scanf("%d",&data);
      }

      return T;

}

bool SearchBST(BSTree T,int key){
     
     if(!T){

        printf("未找到该数据,请重新输入!\n");

        return false;

     }

    else if(T->data==key){

        printf("成功查找到数据:%d\n",T->data);
        
        return true;

    }

    else if(T->data>key){

      SearchBST(T->lchild,key);

    }

    else if(T->data<key){
        
      SearchBST(T->rchild,key);

    }

}

void PrintBST(BSTree T){

         if (!T)

          return;

         PrintBST(T->lchild);

         printf("%d ", T->data);

         PrintBST(T->rchild);

}

/*
 * 在以*T为根结点的树中,删除与key相同的结点。
 * 如果没有此结点返回FALSE。
 */
bool DeleteBST(BSTree *T, int key){
    if (!*T)        //空树。查无此结点。
        return false;
    else if (key == (*T)->data)
    {
        Delete(T);
        return true;
    }
    else if (key < (*T)->data)
    {
        return DeleteBST(&((*T)->lchild), key);
    }
    else
    {
        return DeleteBST(&((*T)->rchild), key);
    }
}
 
/*
 * 删除*T指向的结点
 */
bool Delete(BSTree *T)
{
    BSTree L;
 
    //*T既没有左孩子,又没有右孩子,为叶子结点
    if (!(*T)->lchild && !(*T)->rchild)
        *T = NULL;
    //*T只有右孩子
    else if (!(*T)->lchild)
        *T = (*T)->rchild;
    //*T只有左孩子
    else if (!(*T)->rchild)
        *T = (*T)->lchild;
    //*T既有左孩子,又有右孩子
    else
    {
        L = (*T)->lchild;//L指向被删除结点的左子树
 
        //寻找L的最右孩子
        while (L->rchild)
            L = L->rchild;
 
        //把*T的右子树接到左子树最右孩子的右子树上。
        L->rchild = (*T)->rchild;
        //*T的左子树直接作为*T父结点的子树
        *T = (*T)->lchild;
    }
    return true;
}
  • 7
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值