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

浙公网安备 33010602011771号