zoukankan      html  css  js  c++  java
  • 洛谷 P5018 对称二叉树

    题目传送门

    解题思路:

    先计算每个点的子树有多少节点,然后判断每个子树是不是对称的,更新答案。

    AC代码:

     1 #include<iostream>
     2 #include<cstdio>
     3 
     4 using namespace std;
     5 
     6 struct kkk{
     7     int l,r,v,len;
     8     kkk() {l = -1;r = -1;}
     9 }e[1000001];
    10 int n,ans;
    11 
    12 bool solve(int ls,int rs) {
    13     bool p = 1;
    14     if(e[ls].v != e[rs].v) return false;
    15     if((e[ls].l != -1 && e[rs].r == -1) || (e[ls].l == -1 && e[rs].r != -1) || (e[ls].r == -1 && e[rs].l != -1) || (e[ls].r != -1 && e[rs].l == -1)) return false;
    16     if(e[ls].l != -1 && e[rs].r != -1)
    17         p = p & solve(e[ls].l,e[rs].r);
    18     if(e[ls].r != -1 && e[rs].l != -1)
    19         p = p & solve(e[ls].r,e[rs].l);
    20     return p;
    21 }
    22 
    23 int dfs(int k) {
    24     e[k].len = 1;
    25     if(e[k].l != -1)
    26         e[k].len += dfs(e[k].l);
    27     if(e[k].r != -1)
    28         e[k].len += dfs(e[k].r);
    29     return e[k].len;
    30 }
    31 
    32 int main(){
    33     scanf("%d",&n);
    34     for(int i = 1;i <= n; i++)
    35         scanf("%d",&e[i].v);
    36     for(int i = 1;i <= n; i++)    
    37         scanf("%d%d",&e[i].l,&e[i].r);
    38     dfs(1);
    39     for(int i = 1;i <= n; i++)
    40         if(solve(e[i].l,e[i].r))
    41             ans = max(ans,e[i].len);
    42     printf("%d",ans);
    43     return 0;
    44 }

    //NOIP普及2018 T4

  • 相关阅读:
    面向对象的设计原则
    在VC中Debug下是运行结果正确的,但是在Release下却有错,总算找到原因
    聚合和组合
    痛苦呀,代码
    MSDN和VS98
    阅读代码的难度
    好香,方便面
    人的重要性
    FIT For .NET(1)
    ASP.NET Microsoft .NET Pet Shop 3.x(二)
  • 原文地址:https://www.cnblogs.com/lipeiyi520/p/11268729.html
Copyright © 2011-2022 走看看