P5018 对称二叉树

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\n",ans);
    
    return 0;
}

 

posted @ 2019-07-01 18:50  晔子  阅读(226)  评论(0编辑  收藏  举报