L2-004. 这是二叉搜索树吗?

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\n");
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\n");
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\n");
87     printT(T);
88     printf("%d",T->vul);
89     printf("\n");
90     return 0;
91 }

  如有更好的方法,希望不吝赐教!!

posted @ 2016-06-01 00:09  barriery  阅读(531)  评论(0编辑  收藏  举报