二叉排序树 SDUTOJ 2482

来源:互联网 发布:淘宝卖家怎么添加客服 编辑:程序博客网 时间:2024/06/09 15:11

二叉排序树

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

题目描述

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

输入

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

输出

 

示例输入

21234567899876543214321567890

示例输出

NONO


数据给的有点坑下边是一组正常的例子

样例输入:
25674325432675763420
样例输出:
YESNO

大体思路明明了求一棵树的任两序列是否相同。


#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>using namespace std;struct node{    char  d;    struct node *l,*r;};char s[16],pre1[16],mid1[16],pre2[16],mid2[16];int ps1,ms1,ps2,ms2;void bu(char s,node *rt)//既然是二叉排序树必定是有序的故分情况{    if(rt->d>s)    {        if(rt->l)            bu(s,rt->l);        else        {            node *p;            p=new node;            p->l=p->r=NULL;            p->d=s;            rt->l=p;            return ;//返回上节点        }    }    else    {        if(rt->r)            bu(s,rt->r);        else        {            node *p;            p=new node ;            p->l=p->r=NULL;            p->d=s;            rt->r=p;            return ;        }    }}void pr1(node *rt){    if(rt)    {        pre1[ps1++]=rt->d;        pr1(rt->l);        pr1(rt->r);    }}void mi1(node *rt){    if(rt)    {        mi1(rt->l);        mid1[ms1++]=rt->d;        mi1(rt->r);    }}void pr2(node *st){    if(st)    {        pre2[ps2++]=st->d;        pr2(st->l);        pr2(st->r);    }}void mi2(node *st){    if(st)    {        mi2(st->l);        mid2[ms2++]=st->d;        mi2(st->r);    }}int main(){    int n,m,l1,l2,i;    while(cin>>n&&n)    {        node *rt;        ps1=ms1=0;        cin>>s;        l1=strlen(s);        rt=new node ;        for(i=0; i<l1; i++)        {            if(i==0)//建树            {                rt->d=s[0];                rt->l=rt->r=NULL;            }            else                bu(s[i],rt);        }        pr1(rt);        mi1(rt);        pre1[ps1]='\0';        mid1[ms1]='\0';        while(n--)        {            ps2=ms2=0;            node *st;            st=new node ;            cin>>s;            l2=strlen(s);            for(i=0;i<l2;i++)            {                if(i==0)                {                    st->d=s[0];                    st->l=st->r=NULL;                }                else                {                    bu(s[i],st);                }            }            pr2(st);//分别获取两中序列            mi2(st);//并且都应该给字符串加结束符号,否则有可能夹杂着上一组数的序列            pre2[ps2]='\0';            mid2[ms2]='\0';            if(strcmp(pre1,pre2)==0 )            {                if(strcmp(mid1,mid2)==0)                {                    puts("YES");                }                else                    puts("NO");            }            else                puts("NO");        }    }    return 0;}


0 0
原创粉丝点击