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


    #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次删除操作:
    ");
        scanf("%d%d%d",&n,&k,&m);
        while(n--)
        {
            int num;
            scanf("%d",&num);
            insertTree(T,num);
        }
        printf("中序遍历结果
    ");
        print_in(T);
        cout<<endl;
        while(k--)
        {
            printf("请输入要查找的元素:
    ");
            scanf("%d",&a);
            int ans=Searchtree(T,a,NULL,q);
            cout<<ans<<endl;
        }
        while(m--)
        {
            printf("请输入要删除的元素:
    ");
            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

  • 相关阅读:
    [APIO2017]商旅(分数规划,spfa)
    Codeforces Round #542 div1
    Codeforces Round #556 (Div. 2)
    Codeforces Round #543
    Codeforces Round #534 (Div. 1)
    公式的复习?
    关于概率dp的HINT
    [JSOI2009]密码 [AC自动机]
    bzoj1444[Jsoi2009]有趣的游戏[AC自动机]
    「LibreOJ β Round #4」框架 [bitset]
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/7086424.html
Copyright © 2020-2023  润新知