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;
    }
  • 相关阅读:
    通过 INotifyPropertyChanged 实现观察者模式(转)
    Asp.net MVC中的ViewData与ViewBag(转)
    FireFox地址栏百度搜索
    ZigBee设备类型
    Array.prototype.slice.call(arguments) (转)
    泛型方法扩展
    定义IE的文档兼容模式
    C# Lazy<T>(转)
    AutoCAD2010/2012去掉搜索框
    python 集合类型
  • 原文地址:https://www.cnblogs.com/xiaoyezi-wink/p/11115090.html
Copyright © 2011-2022 走看看