P5018 [NOIP 2018 普及组] 对称二叉树

链接

https://www.luogu.com.cn/problem/P5018

思路

简单的递归,极致的享受。 就是判断左子树的右子树和右子树的左子树是否一样,用递归就行,加上点剪枝。 我感觉复杂度是N^2, 评论区给出的证明说是nlogn,看不懂,贴在下面。

但是能过就行

代码

#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
struct node {
	int l, r, v;
}g[(int)1e6 + 6];
int n, ans;
bool dfs(int x, int y) {
	if (x == -1 && y == -1)return 1;
	if (x == -1 || y == -1)return 0;
	if (g[x].v != g[y].v)return 0;
	if (dfs(g[x].l, g[y].r) && dfs(g[x].r, g[y].l))return 1;
	return 0;
}
int sum(int x) {
	if (x == -1)return 0;
	return sum(g[x].l) + sum(g[x].r) + 1;
}
int main() {
	IOS;
	cin >> n;
	for (int i = 1; i <= n; i++)cin >> g[i].v;
	for (int i = 1; i <= n; i++)cin >> g[i].l >> g[i].r;
	for (int i = 1; i <= n; i++)if (dfs(i, i))ans = max(ans, sum(i));
	cout << ans;
	return 0;
}
posted @ 2025-03-07 11:59  WHUStar  阅读(34)  评论(0)    收藏  举报