zoukankan      html  css  js  c++  java
  • 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
    ");
    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 }

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

  • 相关阅读:
    android_SurfaceView 画图
    android_activity_研究(二)
    android_sdcard读写(一)
    双缓冲的小程序
    C++运算符重载小程序
    再练
    菜鸟的第一个博客(用java写的个小文本框)
    LUCENE第一个小程序(有错)
    蜗牛在奔跑
    指定目录下的java文件存储到一个Txt文本文件中
  • 原文地址:https://www.cnblogs.com/barrier/p/5548184.html
Copyright © 2011-2022 走看看