上午补周测题
下午补周测题,先中序求后序题
晚上 还是先中序求后序题,后中序求前序
要么跳在板子上,要么没落在板子上,所以只需要知道在这块板子上的最远的地方((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");
}