zoukankan      html  css  js  c++  java
  • 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
    ",ans);
        
        return 0;
    }
  • 相关阅读:
    贝塞尔曲线
    行为树
    Astar寻路算法
    vuex入门
    关于用户留存率的计算的几个层次-费元星
    linux命令执行返回值(附错误对照表)费元星
    rabbitmqadmin安装与使用
    分布式锁服务 分布式协调系统
    记录一次使用react异步不更新数据的问题
    从0到1搭建前端异常监控系统(Vue + Webpack + Node.js + Egg.js + Jest)
  • 原文地址:https://www.cnblogs.com/xiaoyezi-wink/p/11115090.html
Copyright © 2011-2022 走看看