L2-004. 这是二叉搜索树吗?
题目链接:https://www.patest.cn/contests/gplt/L2-004
这题我的方法是先递归判定是不是二叉搜索树(镜像),再建树输出。
代码如下:
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 using namespace std; 5 bool isST(int a[],int l,int r){ 6 if(l>=r)return 1; 7 int key=r; 8 for(int i=l+1;i<=r;++i){ 9 if(a[l]<=a[i]){ 10 key=i; 11 break; 12 } 13 } 14 for(int i=key+1;i<=r;++i) 15 if(a[l]>a[i])return 0; 16 return isST(a,l+1,key-1)&&isST(a,key,r); 17 } 18 bool isMirST(int a[],int l,int r){ 19 if(l>=r)return 1; 20 int key=r; 21 for(int i=l+1;i<=r;++i){ 22 if(a[l]>a[i]){ 23 key=i; 24 break; 25 } 26 } 27 for(int i=key+1;i<=r;++i) 28 if(a[l]<=a[i])return 0; 29 return isMirST(a,l+1,key-1)&&isMirST(a,key,r); 30 } 31 struct node{ 32 int vul; 33 node *l,*r; 34 }; 35 node *T=NULL; 36 node* st(node *t,int key){ 37 if(t==NULL){ 38 node *temp=(node*)malloc(sizeof(node)); 39 temp->vul=key; 40 temp->l=NULL; 41 temp->r=NULL; 42 return temp; 43 } 44 if(key>=t->vul)t->r=st(t->r,key); 45 else t->l=st(t->l,key); 46 return t; 47 } 48 node* Mirst(node *t,int key){ 49 if(t==NULL){ 50 node *temp=(node*)malloc(sizeof(node)); 51 temp->vul=key; 52 temp->l=NULL; 53 temp->r=NULL; 54 return temp; 55 } 56 if(key<t->vul)t->r=Mirst(t->r,key); 57 else t->l=Mirst(t->l,key); 58 return t; 59 } 60 void printT(node *t){ 61 if(t==NULL)return; 62 printT(t->l); 63 printT(t->r); 64 if(t!=T)printf("%d ",t->vul); 65 } 66 int main(void){ 67 freopen("in.txt","r",stdin); 68 int a[1001]; 69 memset(a,0,sizeof(a)); 70 int n; 71 scanf("%d",&n); 72 if(n==0){ 73 printf("YES "); 74 return 0; 75 } 76 for(int i=0;i<n;++i) 77 scanf("%d",&a[i]); 78 bool flag1=isST(a,0,n-1); 79 bool flag2=isMirST(a,0,n-1); 80 if(!(flag1||flag2)){ 81 printf("NO "); 82 return 0; 83 } 84 else if(flag1)for(int i=0;i<n;++i)T=st(T,a[i]); 85 else if(flag2)for(int i=0;i<n;++i)T=Mirst(T,a[i]); 86 printf("YES "); 87 printT(T); 88 printf("%d",T->vul); 89 printf(" "); 90 return 0; 91 }
如有更好的方法,希望不吝赐教!!