数据结构 二叉排序树 操作及实现

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
typedef  struct Bitnode
{
    int data;
    struct Bitnode *lchild,*rchild;
} Bitnode,*Bitree;
int Searchtree(Bitree T,int num,Bitree F,Bitree &P)   //在二叉树T种查找元素num  F表示前驱  P表示num元素所在的节点
{
    if(T==NULL)               //未找到该元素
    {
        P=F;                  //p表示num元素应当在的位置的前驱
        return 0;
    }
    else if(T->data==num)
    {
        P=T;
        return 1;
    }
    else if(T->data<=num)
        Searchtree(T->rchild,num,T,P);
    else
        Searchtree(T->lchild,num,T,P);
}
void print_in(Bitree &T)        //中序遍历排序二叉树
{
    if(T!=NULL)
    {
        print_in(T->lchild);
        printf("%d ",T->data);
        print_in(T->rchild);
    }
    return;
}
void insertTree(Bitree &T,int num)  //在二叉排序树T中插入元素NUM
{
    Bitree P,s;
    int flag=Searchtree(T,num,NULL,P);
    if(flag==0)
    {
        s=(Bitree)malloc(sizeof(Bitnode));
        s->data=num;
        s->lchild=NULL;
        s->rchild=NULL;
        if(T==NULL)
            T=s;
        else if(num<P->data)
            P->lchild=s;
        else
            P->rchild=s;
    }
    return;
}
void deletenode(Bitree &T)  //删除该节点
{
    Bitree q,s;
    if(T->rchild==NULL)
    {
        q=T;
        T=T->lchild;
        free(q);
    }
    else if(T->lchild==NULL)
    {
        q=T;
        T=T->rchild;
        free(q);
    }
    else
    {
        q=T;
        s=q->lchild;
        while(s->rchild)
        {
            q=s;
            s=s->rchild;
        }
        T->data=s->data;
        if(T==q)                            //T=q 表示 while循环没有执行  T的左儿子的右子树没有节点
            q->lchild=s->lchild;
        else
            q->rchild=s->lchild;
        free(s);
    }
    return;
}
void Deletetree(Bitree &T,int num)  //在树种删除元素num
{
    if(T==NULL)
        return;
    if(T->data<num)
        Deletetree(T->rchild,num);
    else  if(T->data>num)
        Deletetree(T->lchild,num);
    else                   //找到相同的节点 删除节点操作
    {
     //   cout<<111<<endl;
        deletenode(T);
    }
    return;
}
int main()
{
    int m,n,k;
    int a;
    Bitree T=NULL;
    Bitree q;
    int i,j;
    printf("输入n个元素和k次查找操作和m次删除操作:\n");
    scanf("%d%d%d",&n,&k,&m);
    while(n--)
    {
        int num;
        scanf("%d",&num);
        insertTree(T,num);
    }
    printf("中序遍历结果\n");
    print_in(T);
    cout<<endl;
    while(k--)
    {
        printf("请输入要查找的元素:\n");
        scanf("%d",&a);
        int ans=Searchtree(T,a,NULL,q);
        cout<<ans<<endl;
    }
    while(m--)
    {
        printf("请输入要删除的元素:\n");
        scanf("%d",&a);
        Deletetree(T,a);
        print_in(T);
        cout<<endl;
    }
    return 0;
}
测试数据:
8 3 3
5 7 8 9 10 15 3 1
9 2 5
10 1 15

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值