对称二叉树

 

#include<bits/stdc++.h>
using namespace std;
int size[10000000],n,a[10000000],son[10000000][2];
inline void dfs(int u)
{
size[u]=1;
if(son[u][0]!=-1)
{
dfs(son[u][0]);
size[u]+=size[son[u][0]];
}
if(son[u][1]!=-1)
{
dfs(son[u][1]);
size[u]+=size[son[u][1]];
}
}
inline bool c(int z,int y)
{
if(z==-1&&y==-1)
return true;
if(z!=-1&&y!=-1&&a[z]==a[y]&&c(son[z][0],son[y][1])&&c(son[z][1],son[y][0]))
return true;
return false;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
for(int i=1;i<=n;i++)
{
scanf("%d%d",&son[i][0],&son[i][1]);
}
dfs(1);//计算每个节点的长度。
int ans=0;
for(int i=1;i<=n;i++)
if(c(son[i][0],son[i][1]))
ans=max(ans,size[i]);

cout<<ans;
return 0;
}

 解法如下:

用算出每个节点的长度,等会儿结果那一块需要用到。

再对每一个节点的左右不断比较,如果对称就用这个节点的长度给ans值不断刷新,得到正解。

如果都是空结点也是算作对称的哟。

原文地址:https://www.cnblogs.com/xxmxxm/p/10806154.html