确实挺“玄”,样例都对的但好像过不了,我先看看,把题做了
by 15167987933yy @ 2024-06-01 10:11:58
我是这么写的,里面加了注释,你可以看一下,可以过的
```
#include<iostream>
using namespace std;
int n;
//存放 结点权值
int val[1000050];
//son[i][0]:存放编号为i结点的左孩子编号
int son[1000050][2];
//size[i]:存放编号为i结点作为根节点时 子树的结点数量
int size[1000050];
void num(int u){
//根节点数量
size[u]=1;
//如果有左子树 递归统计左子树结点数量
if(son[u][0]!=-1){
num(son[u][0]);
size[u]+=size[son[u][0]];
}
//如果有右子树 递归统计右子树结点数量
if(son[u][1]!=-1){
num(son[u][1]);
size[u]+=size[son[u][1]];
}
}
//判断根节点u和v构成对应子树是否对称
bool check(int u,int v){
//两个子树为空树 则对称
if(u==-1 && v==-1){
return true;
}
if(u!=-1 && v!=-1 &&val[u]==val[v]
&& check(son[u][0],son[v][1])
&& check(son[u][1],son[v][0])){
return true;
}
return false;
}
int main(){
//输入结点数量
cin>>n;
//输入结点权值
for(int i=1;i<=n;i++){
cin>>val[i];
}
//输入每个结点左右孩子编号
for(int i=1;i<=n;i++){
cin>>son[i][0];//左孩子编号
cin>>son[i][1];//右孩子编号
}
/*
求最大对称子树的结点数量:
以每个结点作为根节点,找到所有可能的子树
判断当前子树是否对称
如果对称,通过比较所有对称子树结点数量,找到最大值
*/
//统计每个结点作为根节点时 对应子树的结点数量
num(1);
//存放最大对称子树的结点数量
int ans=0;
//判断 每个结点为根节点时 对应子树是否对称
for(int i=1;i<=n;i++){
if(check(son[i][0],son[i][1]))
ans=max(size[i],ans);
}
cout<<ans;
}
```
by 15167987933yy @ 2024-06-01 11:21:50