题意:现在给出一棵二叉树,希望你找出它的一棵子树,该子树为对称二叉树,且节点数最多。请输出这棵子树的节点数。对称二叉树满足:将这棵树所有节点的左右子树交换后,新树和原树对应位置的结构相同且点权相等。
(注意输入的是当前节点的左儿子和右儿子,若输入-1则表示该位置不存在点)
数据范围:n <= 1000000.
------------------------------------------我是分割线------------------------------------
题解: 首先预处理每棵子树的大小,用size[x]表示x的子树大小,接下来直接枚举每个点检验即可,非常简单。
#include<bits/stdc++.h>
#define ll long long
#define mp make_pair
#define rep(i, a, b) for(int i = (a); i <= (b); i++)
#define per(i, a, b) for(int i = (a); i >= (b); i--)
using namespace std;
typedef pair<int, int> pii;
typedef double db;
const int N = 1e6 + 50;
int n, head[N], cnt = 0, a[N];
int size[N], f[N], lson[N], rson[N];
int ans;
inline int read(){
int x = 0, f = 1;
char ch = getchar();
while(ch < '0' || ch > '9') { if(ch == '-') f = -1; ch = getchar();}
while(ch >='0' && ch <='9') { x = (x<<3)+(x<<1)+(ch^48); ch = getchar();}
return x*f;
}
void init(){
n = read();
rep(i, 1, n) a[i] = read();
rep(i, 1, n) {
lson[i] = read(); rson[i] = read();
}
}
void dfs(int x){
size[x] = 1;
if(lson[x] != -1){
dfs(lson[x]);
size[x] += size[lson[x]];
}
if(rson[x] != -1){
dfs(rson[x]);
size[x] += size[rson[x]];
}
return;
}
bool check(int u, int v){
if(u == -1 && v == -1) return true;
if(u != -1 && v != -1 && a[u] == a[v] && check(lson[u], rson[v]) && check(rson[u], lson[v]))
return true;
return false;
}
void work(){
dfs(1);
rep(i, 1, n) {
if(check(lson[i], rson[i]))
ans = max(ans, size[i]);
}
printf("%d\n", ans);
}
int main(){
init();
work();
return 0;
}
(刷水题不是我的本意,愉悦身心才是我的真正目的qwq).