二叉排序树(新建,插入,查找,删除)(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;

}

    原文作者:二叉查找树
    原文地址: https://blog.csdn.net/qq_33609401/article/details/53309723
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞