• SDUT 2482 二叉排序树


    二叉排序树

    Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^

    题目描写叙述

    二叉排序树的定义是:或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上全部结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上全部结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。 今天我们要推断两序列是否为同一二叉排序树

    输入

    開始一个数n,(1<=n<=20) 表示有n个须要推断,n= 0 的时候输入结束。
    接下去一行是一个序列,序列长度小于10,包括(0~9)的数字,没有反复数字,依据这个序列能够构造出一颗二叉排序树。
    接下去的n行有n个序列。每一个序列格式跟第一个序列一样,请推断这两个序列能否组成同一颗二叉排序树。(数据保证不会有空树)

    输出

     

    演示样例输入

    2
    123456789
    987654321
    432156789
    0

    演示样例输出

    NO
    NO

    提示

     

    来源

     

    演示样例程序

     
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    
    using namespace std;
    
    char s[11],c[11];
    int a[11],b[12],len,num=0,z[11];
    struct Tree
    {
        int data;
        Tree *L,*R;
    }*Root;
    Tree *Creat()
    {
        Tree *p;
        p=new Tree;
        p->L=NULL;
        p->R=NULL;
        return p;
    }
    int HHH(Tree *root)  //前序
    {
        if(root!=NULL)
        {
            z[num++]=root->data;
            HHH(root->L);
            HHH(root->R);
        }
    }
    int middle(Tree *root) //中序
    {
        if(root!=NULL)
        {
            middle(root->L);
            z[num++]=root->data;
            middle(root->R);
        }
    }
    Tree Build(Tree *root,int c[])  //排列树的建立
    {
        Tree* p;
        root->data=c[0];
        for(int i=1; i<len; i++)
        {
            p=root;
            while(1)
            {
                if(p->data>c[i])
                {
                    if(p->L==NULL)
                    {
                        Tree *q;
                        q=Creat();
                        q->data=c[i];
                        p->L=q;
                        break;
                    }
                    else
                        p=p->L;
                }
                else
                {
                    if(p->R==NULL)
                    {
                        Tree *q;
                        q=Creat();
                        q->data=c[i];
                        p->R=q;
                        break;
                    }
                    else
                        p=p->R;
                }
            }
        }
    }
    int main()
    {
        int n;
        while(~scanf("%d",&n))
        {
            if(n==0)
                break;
            Root=Creat();             //母树
            scanf("%s",s);
            len=strlen(s);
            for(int i=0; i<len; i++)
            {
                a[i]=s[i]-'0';
            }
            num=0;
            Build(Root,a);
            //printf("%d",Root->L->data);
            middle(Root);
            int x[11],x1[11];
            for(int i=0; i<len; i++)
                x[i]=z[i];
            num=0;
    
            HHH(Root);
            for(int i=0; i<len; i++)
                x1[i]=z[i];
            // cout<<x[0];
    
    
            for(int i=0; i<n; i++)        //各比較树
            {
                Tree *Root1;
                Root1=Creat();
                scanf("%s",c);
                int len1=strlen(c);
                if(len==len1)
                {
                    for(int i=0; i<len; i++)
                    {
                        b[i]=c[i]-'0';
                    }
                    num=0;
                    Build(Root1,b);
                    middle(Root1);
                    //cout<<Root1->data;
                    int y[11],y1[11];
                    for(int i=0; i<len; i++)
                        y[i]=z[i];
                    //cout<<x[0]<<y[0];
                    int flag=0;
                    for(int i=0; i<len; i++)
                    {
                        if(x[i]!=y[i])        //中序判定
                        {
                            flag=1;
                            break;
                        }
                    }
    
    
                    if(flag==0)
                    {
                        num=0;
                        HHH(Root1);        //后序判定
                        for(int i=0; i<len; i++)
                            y1[i]=z[i];
                        for(int i=0; i<len; i++)
                        {
                            if(x1[i]!=y1[i])
                            {
                                flag=1;
                                break;
                            }
                        }
                    }
                    if(flag==0)
                        printf("YES
    ");
                    else
                    {
                        printf("NO
    ");
                    }
                }
                else
                {
                    printf("NO
    ");
                }
            }
        }
    }
    

  • 相关阅读:
    bzoj 1121: [POI2008]激光发射器SZK 思维_结论
    bzoj 1189: [HNOI2007]紧急疏散evacuate 分层图最大流 + 拆点 + 二分
    luogu 3467 [POI2008]PLA-Postering 单调栈
    BZOJ1143: [CTSC2008]祭祀river 网络流_Floyd_最大独立集
    BZOJ 1123: [POI2008]BLO 求割点+乘法原理+计数
    bzoj 1191: [HNOI2006]超级英雄Hero 网络流 + 残量网络
    无题
    numpy模块(对矩阵的处理,ndarray对象)
    python面向过程编程
    logging模块,程序日志模板
  • 原文地址:https://www.cnblogs.com/llguanli/p/8726868.html
Copyright © 2020-2023  润新知