RT,只能通过 n≤10 、完全二叉树和点权均为1的情况,是不是少考虑了些什么?
代码:
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;
const int NR = 1e6 + 5;
ll a[NR], son[NR][2], size[NR];
ll n;
ll ans = 0;
void dfs(ll k) //找出每一个节点的子节点个数
{
size[k] = 1;
if(son[k][0] != -1)
{
dfs(son[k][0]);
size[k] += size[son[k][0]];
}
if(son[k][1] != -1)
{
dfs(son[k][1]);
size[k] += size[son[k][1]];
}
}
bool chk(ll p, ll q) //判断根节点为p和q的两个子树是否对称
{
if(p == q && q == -1)
return true;
if(p != -1 && q != -1 && chk(son[p][0], son[q][1]) && chk(son[p][1], son[q][0]))
return true;
return false;
}
int main()
{
scanf("%lld", &n);
for(int i = 1; i <= n; i ++)
scanf("%lld", a + i);
for(int i = 1; i <= n; i ++)
scanf("%lld%lld", &son[i][0], &son[i][1]);
dfs(1);
for(int i = 1; i <= n; i ++)
if(chk(son[i][0], son[i][1]))
ans = max(ans, size[i]);
printf("%lld", ans);
return 0;
}