此题的题解就是暴力题解,没有什么技巧性。但需要关注的点就是如何判断此节
点所对应的二叉树是否满足对称,其实随便一个点是否满足肯定要不停的找子节
点,那么就要想到dfs的思想!
首先先用一个函数找出所有点的子节点有几个
然后再用check函数判断每一个节点为根的树是否满足对称二叉数的条件
最关键的是check函数判断是递归的判断——长知识
代码 c or cpp
#include<bits/stdc++.h>
using namespace std;
int i,n,value[1000010],son[1000010][2],bulk[1000010],ans;
void dfs(int x)//找每一个节点所对应的子节点的数目
{
bulk[x]=1;//初始化为1
if(son[x][0]!=-1)
{
dfs(son[x][0]);
bulk[x]=bulk[x]+bulk[son[x][0]];
}
if(son[x][1]!=-1)
{
dfs(son[x][1]);
bulk[x]=bulk[x]+bulk[son[x][1]];
}
return ;
}
bool check(int left,int right)//判断是否满足对称二叉树的条件
{
if(left==-1&&right==-1)
{
return true;
}
if(left!=-1&&right!=-1&&value[left]==value[right]&&check(son[left][0],son[right][1])&&check(son[left][1],son[right][0]))//递归的判断
{
return true;
}
return false;
}
int main()
{
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&value[i]);
}
for(i=1;i<=n;i++)//一个是左儿子,一个是右儿子
{
scanf("%d %d",&son[i][0],&son[i][1]);
}
dfs(1);//从根节点出发
for(i=1;i<=n;i++)
{
if(check(son[i][0],son[i][1]))
{
ans=max(ans,bulk[i]);
}
}
printf("%d",ans);
return 0;
}