数据结构课设—树型结构题目—二叉排序树

编程实现二叉排序树的创建、插入、删除和查询

#include <bits/stdc++.h>
//二叉排序树
using namespace std;
int a[1005];
typedef struct BTnode
{
    char data;
    BTnode *lchild,*rchild;
} BTnode,*BTtree;
BTtree creatBTtree()
{
    BTtree bt=NULL;
    return bt;
}
void InOrderTraverseBTtree(BTtree T)//中序遍历
{
    if(T)
    {
        InOrderTraverseBTtree(T->lchild);
        printf("%d ",T->data);
        InOrderTraverseBTtree(T->rchild);
    }
    else
    {
        return;
    }
}
int SearchBST(BTtree T,int e,BTtree f,BTtree *p)//寻找元素是否存在
//T为当前根节点,e为要查找的元素,f为T的父节点,p为找到的元素节点或没找到时的根节点
{
    if(!T)//若树空
    {
        *p=f;
        return 0;
    }
    else if(T->data==e)//若找到该元素
    {
        *p=T;
        return 1;
    }
    else if(e<T->data)//如果该元素比根节点值小
        return SearchBST(T->lchild,e,T,p);//在T左子树中找
    else//如果该元素比根节点值大
        return SearchBST(T->rchild,e,T,p);//在T右子树中找
}

int InsertBST(BTtree *T,int e)//插入函数
{
    BTtree s=NULL,p;
    if(!SearchBST(*T,e,NULL,&p))//如果该元素不在树中
    {
        s=new BTnode;
        s->data=e;
        s->lchild=s->rchild=NULL;//新建节点s
        if(!p)//若p为空指针
        {
            *T=s;
        }
        else if(p->data>e)//如果该元素比根节点值小
        {
           p->lchild=s;
        }
        else//如果该元素比根节点值大
        {
            p->rchild=s;
        }
        return 1;
    }
    else
        return 0;
}


int Delete(BTtree *p)//删除函数的具体操作
{
    BTtree q,s;
    if((*p)->rchild==NULL)//缺右子树
    {
        q=*p;
        *p=(*p)->lchild;//用左子女替代
        free(q);
    }
    else if((*p)->lchild==NULL)//缺左子树
    {
        q=*p;
        *p=(*p)->rchild;//用右子女替代
        free(q);
    }
    else//左,右子树都存在
    {
        q=*p;
        s=(*p)->lchild;
        while(s->rchild)
        {
            q=s;
            s=s->rchild;
        }
        (*p)->data=s->data;//用左子树的最大节点代替
        if(*p!=q)
        {
            q->rchild=s->lchild;
        }
        else
        {
            q->lchild=s->lchild;
        }
        free(s);
    }
    return 1;
}
int DeleteBST(BTtree *T,int e)//删除函数
{
    if(!*T)
    {
        return -1;
    }
    else
    {
        if((*T)->data==e)
        {
            return Delete(T);
        }
        else if(e<(*T)->data)
        {
            return DeleteBST(&(*T)->lchild,e);
        }
        else
        {
            return DeleteBST(&(*T)->rchild,e);
        }
    }
}

int main()
{
    BTtree T,p;
    T=creatBTtree();
    int x,n;
    n=0;
    printf("请输入你要创建二叉排序树的数字,输入0表示结束输入:");
    while(~scanf("%d",&x))
    {
        if(!x)
            break;
        a[++n]=x;
    }
    for(int i=1; i<=n; i++)
    {
        InsertBST(&T,a[i]);
    }
    printf("中序遍历该二叉排序树的结果为:");
    InOrderTraverseBTtree(T);
    printf("\n");

    int num;
    printf("请输入你要插入的数字:");
    cin>>num;
    InsertBST(&T,num);
    printf("插入该数字后中序遍历该二叉排序树的结果为:");
    InOrderTraverseBTtree(T);
    printf("\n");

    int xx,y;
    printf("请输入你要查询的数字:");
    cin>>xx;
    if(SearchBST(T,xx,NULL,&p))
    {
        printf("该数存在\n");
    }
    else
    {
        printf("该数不存在\n");
    }
    printf("请输入你要删除的数字:");
    cin>>y;
    if(!SearchBST(T,y,NULL,&p))
    {
        printf("该数不存在,无法进行删除操作!\n");
    }
    else
    {
        DeleteBST(&T,y);
        printf("进行删除操作后中序遍历该二叉排序树的结果为:");
        InOrderTraverseBTtree(T);
    }
    printf("\n");
    return 0;
}
/*
1 5 4 2 6 8 7 9 11 14 13 12 16 19 0
*/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值