二叉排序树
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");
}
}
}
}