#include <bits/stdc++.h>
using namespace std;
const int N = 1000005;
int a[N], l[N], r[N];
int n;
int ans = 1;
bool flag;
void check(int x, int y);// 检测是否是对称二叉树
int calc(int k);// 以k为根节点,返回这颗子树所有节点之和
void check(int x, int y) {
if(x==-1 && y==-1)
return;
if(x==-1 || y==-1 || a[x]!=a[y]){
flag = false;
return;
}
check(l[x], r[y]);//判断左子树
check(r[x], l[y]);//判断右子树
}
int calc(int k){
int sum = 0;
if(l[k]!=-1)
sum += calc(l[k]);
if(r[k] != -1)
sum += calc(r[k]);
return 1 + sum;
}
int main( ) {
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++){
cin>>l[i];
cin>>r[i];
}
for(int i=1;i<=n;i++) {
if(l[i]!=-1 && r[i]!=-1 && a[l[i]]==a[r[i]]){
flag = true; // 先假定以i为根节点,其子树是对称二叉树
check(l[i], r[i]);
if(flag)
ans = max(ans, calc(i));
}
}
cout << ans;
return 0;
}
这是我们老师给的代码,但是我认为会 TLE,没想到一提交却 AC 了。请问这个代码的时间复杂度大概是多少?