1. 程式人生 > >SDUT 2482 二叉排序樹

SDUT 2482 二叉排序樹

reat can urn AR trac data main itl str

二叉排序樹

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");
            }
        }
    }
}

SDUT 2482 二叉排序樹