上午 开始听英语听力,记一些单词
下午晚上 在洛谷写题
前序遍历是根左右,后序遍历是左右根,当一个节点下只有一个节点时,不管它是左孩还是右孩,它前序后序遍历都是一样的,所以这时就有两种情况,即当前序遍历为ab,后序遍历为ba,那么它就有两种情况,因为b可以是左孩也可以是右孩。所以只要找到有多少个这样的。
#include<stdio.h>
#include<string.h>
#include<math.h>
char f[100],p[100];
int main()
{
scanf("%s",f);
scanf("%s",p);
int str=strlen(f);
int s=0;
for(int i=0;i<str-1;i++){
for(int j=0;j<str;j++){
if(f[i]==p[j]){
if(f[i+1]==p[j-1])
s++;
break;
}
}
}
int sum=pow(2,s);
printf("%d\n",sum);
}
一开始搞错题目意思了,原来输入的 i 行的两个数就是就是 i 节点的两个孩子。就可以用一个结构体来保存 i 节点的左右数。递归的时候就从根节点1开始,一直往下搜,遇到0就返回,换另外一边往下搜。记录最大深度。
#include<stdio.h>
struct Node
{
int l,r;
}tree[1000001];
int s=0;
void M(int x,int deep)
{
if(x==0) return;//遇到0返回到上个节点
if(s<deep) s=deep;
M(tree[x].l,deep+1);//搜左儿
M(tree[x].r,deep+1);//搜右儿
}
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d%d",&tree[i].l,&tree[i].r);
}
M(1,1);
printf("%d\n",s);
}