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\n");
                else
                {
                    printf("NO\n");
                }
            }
            else
            {
                printf("NO\n");
            }
        }
    }
}

posted @ 2018-04-06 09:18  llguanli  阅读(111)  评论(0编辑  收藏  举报