P5018 对称二叉树
题解
什么是对称二叉树,简洁一点就是:
任意一棵对称二叉树,以根节点为轴,是轴对称的 (QWQ我真的只能解释道这样了)
这道题可以用DFS求解
DFS深搜,size[ x ] 记录以 x 为根的树的大小(也就是以 x 为根的树的所有节点的总数)
当前节点左儿子非空,继续递归左儿子,右儿子非空,继续递归右儿子
size[ x ]就等于它自己+左子树大小+右子树大小
当我们判断对称二叉树的时候,可以用到一个check函数
对于当前节点
如果左右子树都空,那么一定是对称二叉树
如果左右子树都非空,而且左右儿子权值相等,继续判断他左儿子的右儿子和右儿子的左儿子是否相等,以及左儿子的左儿子和右儿子的右儿子是否相等,不断递归check,全部满足条件才是对称二叉树,才有机会成为候选答案
否则的话就不会成为对称二叉树了
代码
#include<bits/stdc++.h> using namespace std; const int maxn=1e6+10; int n,ans=-1; int tree[maxn],son[maxn][3],size[maxn]; void dfs(int x) { size[x]=1; if(son[x][1]!=-1) { dfs(son[x][1]); size[x]+=size[son[x][1]]; } if(son[x][2]!=-1) { dfs(son[x][2]); size[x]+=size[son[x][2]]; } } bool check(int l,int r) { if(l==-1&&r==-1) return true; if(l!=-1&&r!=-1&&tree[l]==tree[r]&&check(son[l][2],son[r][1])&&check(son[l][1],son[r][2])) return true; return false; } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&tree[i]); for(int i=1;i<=n;i++) scanf("%d%d",&son[i][1],&son[i][2]); dfs(1); for(int i=1;i<=n;i++) if(check(son[i][1],son[i][2])) ans=max(ans,size[i]); printf("%d ",ans); return 0; }