AC

 •  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;
}
//结构体代码

 •  4天前

请先登录,才能进行评论