求条,玄关
查看原帖
求条,玄关
1128458
Goodans楼主2024/10/20 16:49

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;
}

2024/10/20 16:49
加载中...