【NOIP2018普及组】对称二叉树
题解:
先枚举根节点再判断是不是对称二叉树
#include<bits/stdc++.h>
using namespace std;
int l[1000001],r[1000001],m,a[1000001],ans=1;
bool f;
int dfs(int x,int y,int s) {
if(x==-1&&y==-1) return 0;
if((x==-1||y==-1)&&x!=y) {
f=1;
return 0;
}
if(a[x]!=a[y]) {
f=1;
return 0;
}
return dfs(l[x],r[y],2)+dfs(r[x],l[y],2)+s;
}
int read() {
int x=0,f=1;
char s;
s=getchar();
while(s<'0'||s>'9') {
if(s=='-') f=-1;
s=getchar();
}
while(s>='0'&&s<='9') {
x=(x<<3)+(x<<1)+s-'0';
s=getchar();
}
return x*f;
}
int main() {
m=read();
for(int i=1; i<=m; i++) a[i]=read();
for(int i=1; i<=m; i++) {
l[i]=read();
r[i]=read();
}
for(int i=1; i<=m; i++) {
int s=dfs(l[i],r[i],3);
if(s>ans&&f==0) ans=s;
f=0;
}
cout<<ans;
return 0;
}