赞
踩
#include <bits/stdc++.h>
using namespace std;
const int N = 1000005;
int l[N], r[N], v[N];
int res = 1;
bool flag = true; // 是否对称
// 函数用于寻找对称二叉树,x, y表示正在判断的两个子树中正在判断的结点,tot表示结点总数
int dfs(int x, int y, int tot) {
if (x == -1 && y == -1) { // 目前结点均为空
return 0;
}
if ((x == -1 || y == -1 && x != y) || (v[x] != v[y])) { // 结点不对称或权值不对称
flag = false;
return 0;
}
// 继续递归,返回值=下面节点数+上面节点数
return dfs(l[x], r[y], 2) + dfs(r[x], l[y], 2) + tot;
}
int main() {
int m;
cin >> m;
for (int i = 1; i <= m; ++i) {
cin >> v[i];
}
for (int i = 1; i <= m; ++i) {
cin >> l[i] >> r[i];
}
for (int i = 1; i <= m; ++i) {
// 根节点和两个子节点,共3个
int tmp = dfs(l[i], r[i], 3);
if (tmp > res && flag == true) {
res = tmp;
}
flag = true;
}
cout << res << '\n';
return 0;
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。