❤ • 4天前
#include <bits/stdc++.h>
using namespace std;
const int N = 1000000 + 5;
typedef long long ll;
ll n; // 二叉树的总节点数
ll l[N] = {0}; // 存储每个节点的左孩子索引(0表示空节点)
ll r[N] = {0}; // 存储每个节点的右孩子索引(0表示空节点)
ll a[N]; // 存储每个节点的值
ll ans; // 记录最大对称子树的节点数
/**
* 判断以x为根的子树和以y为根的子树是否镜像对称
*x 第一个子树的根节点
*y 第二个子树的根节点
* 若镜像对称返回true,否则返回false
*/
bool check(ll x, ll y) {
// 两个节点都为空,视为对称
if (x == 0 && y == 0)
return true;
// 节点值不同,不对称
if (a[x] != a[y])
return false;
// 递归判断:x的左子树对应y的右子树,x的右子树对应y的左子树(镜像关系)
return ((check(l[x], r[y]) && check(r[x], l[y])));
}
/*
* 深度优先搜索计算子树信息,并判断是否为对称子树
* rt 当前子树的根节点
* h 引用参数,用于返回当前子树的高度
* sz 引用参数,用于返回当前子树的节点总数
*/
void dfs(ll rt, ll &h, ll &sz) {
// 空节点处理:高度0,节点数0
if (rt <= 0) {
h = 0, sz = 0;
return;
}
// 递归处理左子树,获取左子树高度h1和节点数sz1
ll h1, h2, sz1, sz2;
dfs(l[rt], h1, sz1);
// 递归处理右子树,获取右子树高度h2和节点数sz2
dfs(r[rt], h2, sz2);
// 若左右子树高度相同且节点数相同,才可能对称
if (h1 == h2 && sz1 == sz2)
// 检查左右子树是否镜像对称
if (check(l[rt], r[rt]))
// 若对称,更新最大对称子树节点数(当前子树节点数=左+右+根)
ans = max(ans, sz1 + sz2 + 1);
// 计算当前子树高度:左右子树最大高度+1(根节点自身)
h = max(h1, h2) + 1;
// 计算当前子树节点数:左右子树节点数之和+1(根节点自身)
sz = sz1 + sz2 + 1;
}
int main() {
// 读取节点总数
scanf("%lld", &n);
// 读取每个节点的值
for (int i = 1; i <= n; i++)
scanf("%lld", &a[i]);
// 读取每个节点的左右孩子(输入-1表示空节点,转换为0统一处理)
for (int i = 1; i <= n; i++) {
scanf("%lld%lld", &l[i], &r[i]);
if (l[i] == -1)
l[i]++; // -1转为0
if (r[i] == -1)
r[i]++;
}
// 空节点默认值设为-1
a[0] = -1;
// 初始化最大对称子树节点数为1
ans = 1;
// 临时变量存储根节点的高度和节点数
ll h, sz;
dfs(1, h, sz);
// 输出结果
printf("%lld", ans);
return 0;
}
评论:
#include <bits/stdc++.h>
using namespace std;
struct TreeNode {
int val;
int l, r;
} a[1000005];
bool check(int x, int y) {
if (x == 0 && y == 0) {
return true;
}
if (x == 0 || y == 0) {
return false;
}
if (a[x].val != a[y].val) {
return false;
}
return check(a[x].l, a[y].r) && check(a[x].r, a[y].l);
}
void dfs(int root, int &h, int &sz, int &ans) {
if (root == 0) {
h = 0;
sz = 0;
return;
}
int h1, h2, sz1, sz2;
dfs(a[root].l, h1, sz1, ans);
dfs(a[root].r, h2, sz2, ans);
if (check(a[root].l, a[root].r)) {
ans = max(ans, sz1 + sz2 + 1);
}
h = max(h1, h2) + 1;
sz = sz1 + sz2 + 1;
}
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i].val;
}
for (int i = 1; i <= n; i++) {
int l, r;
cin >> l >> r;
a[i].l = (l == -1) ? 0 : l;
a[i].r = (r == -1) ? 0 : r;
}
a[0].val = -1;
int ans = 1;
int h, sz;
dfs(1, h, sz, ans);
cout << ans << endl;
return 0;
}
//结构体代码
请先登录,才能进行评论