7-4 是否同一棵二叉搜索树

在这里插入图片描述

#include<stdio.h>

int ss(int *a,int *b,int c);

int main(){
    int a,b,c[10],d[10],n,m;
    scanf("%d",&a);
    for(;a;){
        scanf("%d",&b);
        for(n=0;n<a;n++){
            scanf("%d",&c[n]);
        }
        for(n=0;n<b;n++){
            for(m=0;m<a;m++){
                scanf("%d",&d[m]);
            }
            if(ss(c,d,a)){
                printf("Yes\n");
            }else{
                printf("No\n");
            }
        }
        scanf("%d",&a);
    }
}

int ss(int *a,int *b,int c){
    if(!c)return 1;
    if(a[0]!=b[0])return 0;
    int d[9],e[9],f[9],g[9],n=1,i=0,j=0;
    for(;n<c;n++){
        if(a[n]<a[0]){
            d[i]=a[n];
            i++;
        }else{
            e[j]=a[n];
            j++;
        }
    }
    for(n=1,i=j=0;n<c;n++){
        if(b[n]<a[0]){
            f[i]=b[n];
            i++;
        }else{
            g[j]=b[n];
            j++;
        }
    }
    return ss(d,f,i)&&ss(e,g,j);
}

第二种解法
在这里插入图片描述

#include<stdio.h>
int main(){
    int a,b,e[2048],f[2048],n,m;
    scanf("%d",&a);
    for(;a;){
        for(n=1;n<2048;n++){
            e[n]=0;
        }
        scanf("%d",&b);
        for(n=0;n<a;n++){
            scanf("%d",&e[0]);
            for(m=1;e[m];){
                if(e[m]<e[0]){
                    m=2*m+1;
                }else{
                    m*=2;
                }
            }
            e[m]=e[0];
        }
        for(n=0;n<b;n++){
            for(m=1;m<2048;m++){
                f[m]=0;
            }
            for(m=0;m<a;m++){
                scanf("%d",&e[0]);
                for(f[0]=1;f[f[0]];){
                    if(e[f[0]]<e[0]){
                        f[0]=2*f[0]+1;
                    }else{
                        f[0]*=2;
                    }
                }
                if(e[f[0]]!=e[0]){
                    printf("No\n");
                    for(f[0]=m+1;f[0]<a;f[0]++){
                        scanf("%d",&e[0]);
                    }
                    break;
                }
                f[f[0]]=1;
            }
            if(m==a){
                printf("Yes\n");
            }
        }
        scanf("%d",&a);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值