对称二叉树
对称二叉树
https://ac.nowcoder.com/acm/problem/21472
#include<bits/stdc++.h> #define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0); #define ll long long const int N=1e6+5; using namespace std; int a[N][2],size[N],v[N];//a存储树,size存储每个节点的子节点个数,v存节点的权值 bool check(int u,int l){ if(u==-1&&l==-1)return true; if(u!=-1&&l!=-1){ if(v[u]==v[l]) if(check(a[u][0],a[l][1])&&check(a[u][1],a[l][0]))return true;//对比两个子树是否对称 } return false; } void dfs(int x){//记录每个节点的子节点个数 size[x]=1; if(a[x][0]==-1&&a[x][1]==-1)return; if(a[x][0]!=-1){ dfs(a[x][0]); size[x]+=size[a[x][0]]; } if(a[x][1]!=-1){ dfs(a[x][1]); size[x]+=size[a[x][1]]; } } int main() { ios; int n; cin>>n; for(int i=1;i<=n;i++){ cin>>v[i]; } for(int i=1;i<=n;i++){ cin>>a[i][0]>>a[i][1]; } dfs(1); int ans=0; for(int i=1;i<=n;i++){ if(check(a[i][0],a[i][1])) ans=max(ans,size[i]); } cout<<ans<<endl; }