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