二叉排序树
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
数据给的有点坑下边是一组正常的例子
-
样例输入:
-
2 567432 543267 576342 0
-
样例输出:
-
YES NO
大体思路明明了求一棵树的任两序列是否相同。
#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;
}