思路
- 1.先用结构体存树
- 2.对树进行dfs遍历,记录子树的大小
- 3.写一个check函数判断是否是对称二叉树
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10,INF=0x3f3f3f3f;
typedef long long ll;
struct node{
int v;
int l,r;
int size;
}tree[N];
int n,ans;
void dfs(int u){
tree[u].size=1;
if(tree[u].l!=-1){
dfs(tree[u].l);
tree[u].size+=tree[tree[u].l].size;
}
if(tree[u].r!=-1){
dfs(tree[u].r);
tree[u].size+=tree[tree[u].r].size;
}
}
bool check(int a,int b){
if(a==-1&&b==-1) return true;
if(a==-1) return false;
if(b==-1) return false;
if(tree[a].v!=tree[b].v) return false;
if(check(tree[a].l,tree[b].r)&&check(tree[b].l,tree[a].r)){
return true;
}
return false;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cin>>n;
for(int i=1;i<=n;i++){
cin>>tree[i].v;
}
for(int i=1;i<=n;i++){
cin>>tree[i].l>>tree[i].r;
}
dfs(1);
for(int i=1;i<=n;i++){
if(check(tree[i].l,tree[i].r)) ans=max(ans,tree[i].size);
}
cout<<ans<<"\n";
return 0;
}