SDUT 2482 二叉排序樹
阿新 • • 發佈:2018-04-06
reat can urn AR trac data main itl str
?
二叉排序樹
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"); } } } }
SDUT 2482 二叉排序樹