52pts WA
#include <iostream>
#include <vector>
#include <memory>
using namespace std;
// 定义二叉树节点结构体
struct TreeNode {
int val; // 节点的值
shared_ptr<TreeNode> left; // 左子节点
shared_ptr<TreeNode> right; // 右子节点
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} // 构造函数
};
// 辅助函数:检查两个子树是否对称
bool isSymmetric(shared_ptr<TreeNode> left, shared_ptr<TreeNode> right) {
if (!left && !right) return true; // 如果两个子树都为空,则它们是对称的
if (!left || !right) return false; // 如果其中一个子树为空,另一个不为空,则它们不对称
return (left->val == right->val) && isSymmetric(left->left, right->right) && isSymmetric(left->right, right->left);
}
// 计算最大对称子树的大小
int maxSymmetricSubtree(shared_ptr<TreeNode> root) {
if (!root) return 0; // 如果节点为空,返回0
int left_size = maxSymmetricSubtree(root->left); // 计算左子树的最大对称子树大小
int right_size = maxSymmetricSubtree(root->right); // 计算右子树的最大对称子树大小
int current_size = 1 + left_size + right_size; // 当前子树的大小
if (isSymmetric(root->left, root->right)) { // 如果左右子树对称
return current_size; // 返回当前子树的大小
}
return max(left_size, right_size); // 否则返回左右子树中较大的那个
}
int main() {
int n;
cin >> n; // 输入节点个数
vector<int> values(n); // 存储节点值的数组
for (int i = 0; i < n; ++i) {
cin >> values[i]; // 输入节点值
}
vector<shared_ptr<TreeNode>> nodes(n + 1); // 存储节点的数组
for (int i = 1; i <= n; ++i) {
nodes[i] = make_shared<TreeNode>(values[i - 1]); // 创建节点并存储到数组中
}
for (int i = 1; i <= n; ++i) {
int l, r;
cin >> l >> r; // 输入左右子节点的索引
if (l != -1) nodes[i]->left = nodes[l]; // 如果有左子节点,将其连接到当前节点
if (r != -1) nodes[i]->right = nodes[r]; // 如果有右子节点,将其连接到当前节点
}
cout << maxSymmetricSubtree(nodes[1]) << endl; // 输出最大对称子树大小
return 0;
}