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