rt ,使用DFS判断是否为对称二叉树,然后暴力尝试每棵子树。三个CCF提供样例都过了,在#9后面都挂了(吸氧WA不吸氧RE)。本地试过#9,貌似是对的。
code
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
typedef long long ll;
const ll MAXN = 1e6 + 10;
ll v[MAXN], l[MAXN], r[MAXN], siz[MAXN], answer;
void init(ll x){
if(l[x] == 0 && r[x] == 0){
siz[x] = 1;
return;
}
if(l[x])init(l[x]);
if(r[x])init(r[x]);
siz[x] = siz[l[x]] + siz[r[x]] + 1;
}
bool cmp(ll x, ll y){
// cout << x << " " << y << " " << v[x] << " " << v[y] << " " << siz[x] << " " << siz[y] << "\n";
if(x == 0 && y == 0)return true;
if(x == 0 && y == 1)return false;
if(y == 0 && x == 1)return false;
if(siz[x] != siz[y] || v[x] != v[y])return false;
if(siz[x] == 1)return true;
if(cmp(l[x], r[y]) && cmp(r[x], l[y])){
return true;
}
}
void solve(ll x){
// cout << x << "##\n";
if(l[x] == 0 && r[x] == 0){
answer = max(answer, (ll)1);
return;
}
if(l[x] && r[x] && cmp(l[x], r[x])){
answer = max(answer, siz[x]);
}
if(l[x])solve(l[x]);
if(r[x])solve(r[x]);
}
int main(){
// freopen("tree3.in", "r", stdin);
// freopen("tree3.out", "w", stdout);
ll n;
cin >> n;
for(ll i = 1; i <= n; i ++)cin >> v[i];
for(ll i = 1; i <= n; i ++){
cin >> l[i] >> r[i];
if(l[i] == -1)l[i] = 0;
if(r[i] == -1)r[i] = 0;
}
init(1);
// cout << cmp(l[1], r[1]);
solve(1);
cout << answer;
return 0;
}