0
点赞
收藏
分享

微信扫一扫

2022.1.19

cnlinkchina 2022-01-20 阅读 45

上午补周测题

下午补周测题,先中序求后序题

晚上 还是先中序求后序题,后中序求前序

 要么跳在板子上,要么没落在板子上,所以只需要知道在这块板子上的最远的地方((i-1)*m+l)/d)*d再跳一下,看它是否能跳在后面的板子上。

#include<stdio.h>

int main()
{
    long long n,d,m,l,s=0,i;
    scanf("%lld%lld%lld%lld",&n,&d,&m,&l);
    for(i=1;i<=n;i++){
        if(s<(i-1)*m){//跳到缝隙里了,结束
            break;
        }
        s=(((i-1)*m+l)/d)*d+d;//在第i块板子上最远距离+d
    }
    printf("%lld\n",s);
}

将每一项都列出来,判断符不符合要求

#include<stdio.h>

int DD,MM,YY;
int Mon[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};

int M(int d,int m,int y)
{
    if(d>Mon[m]||d<1||m>12||m<1) return 0;//年月日越界不可行
    if(y%4!=0&&m==2&&d>28) return 0;//平年2月越界
    if((y+18)<YY||y+18==YY&&m<MM||y+18==YY&&m==MM&&d<=DD) return 1;//达到年龄要求
    else return 0;
}

int main()
{
    int BD,BM,BY;
    scanf("%d.%d.%d",&DD,&MM,&YY);
    scanf("%d.%d.%d",&BD,&BM,&BY);

    if(M(BD,BM,BY)||M(BD,BY,BM)||M(BM,BD,BY)||M(BM,BY,BD)||M(BY,BD,BM)||M(BY,BM,BD))//有一项符合就行
        printf("YES\n");
    else printf("NO\n");
}

前序遍历是根左右,中序是左根右,先从前序开始,前序遍历的第一个就是根节点,然后遍历中序找到它的位置,中序中它左边的字母就是根节点的左子树,右边就是右子树,再把左边的看成是一个树,遍历的第一个就是根节点的左孩,又可以从中序中找到左右子树...右边也看成一个树,遍历的第一个就是根节点的右孩...就可以用递归实现建一个二叉树(讲道理一开始好像懂了也不知道咋个用递归实现

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char f[100],m[100];

typedef struct Tree
{
    char data;
    struct Tree *lc,*rc;//左孩,右孩
}tree;

tree *M(int l,int r,int l2,int r2,tree *T)
{
    if(l>r||l2>r2) return NULL;
    T=(tree *)malloc(sizeof(tree));
    T->data=f[l];//前序遍历的第一个字母就是根节点
    if(l2==r2){//只有这一个字母,它就是叶节点
        T->lc=NULL;
        T->rc=NULL;
        return T;
    }
    int s=0;
    for(int i=l2;i<=r2;i++){
        if(m[i]==f[l]) break;
        else s++;
    }
    T->lc=M(l+1,l+s,l2,l2+s-1,T->lc);//递归左子树
    T->rc=M(l+s+1,r,l2+s+1,r2,T->rc);//递归右子树
    return T;
}

void Posttree(tree *T)//后序遍历
{
    if(T==NULL) return;
    Posttree(T->lc);
    Posttree(T->rc);
    printf("%c",T->data);
}

int main()
{
    tree *T;
  //  gets(m);//中序
    //gets(f);//前序
    scanf("%s",m);
    scanf("%s",f);
    int str=strlen(m);
    T=M(0,str-1,0,str-1,T);
    Posttree(T);
    printf("\n");
}

 

 这个和前面的那题差不多,后序的话是左右根,从最后面开始第一个是根节点,然后还是从中序中分成左右子树..

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char m[100],p[100];

typedef struct Node
{
    char data;
    struct Node *lc,*rc;
}tree;


tree *M(int l,int r,int l2,int r2,tree *T)
{
    if(l>r||l2>r2) return NULL;
    T=(tree *)malloc(sizeof(tree));
    T->data=p[r];
    if(l2==r2){
        T->lc=NULL;
        T->rc=NULL;
        return T;
    }
    int s=0,b;
    for(int i=l2;i<=r2;i++){
        if(m[i]==p[r]) {b=i;break;}
        else s++;
    }
    T->lc=M(l,l+s-1,l2,l2+s-1,T->lc);
    T->rc=M(l+s,r-1,l2+s+1,r2,T->rc);
    return T;
}

void Pretree(tree *T)//前序遍历
{
    if(T==NULL) return;
    printf("%c",T->data);
    Pretree(T->lc);
    Pretree(T->rc);
}

int main()
{
    tree *T;
    scanf("%s",m);
    scanf("%s",p);
    int str=strlen(m);
    T=M(0,str-1,0,str-1,T);
    Pretree(T);
    printf("\n");
}
举报

相关推荐

0 条评论