zoukankan      html  css  js  c++  java
  • P5018 对称二叉树题解

    题目内容链接:

    那么根据题意,上图不是对称二叉树,只有节点7的子树是;

    通俗来说,对称二叉树就是已一个节点x为根的子树有穿过x点的对称轴并且对称轴两边的对称点的大小也必须相等,那么这棵树就是对称二叉树。

    思路也很简单:递归处理每个节点的子树的节点数size,然后枚举每一个节点的子树来判断是否为对称二叉树。如果一边有节点另一边没有就return剪枝,一旦碰到不一样的节点就剪枝。

    特别的,单个节点也是一个对称二叉树。

    代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define LL long long
    using namespace std;
    int read(){//快读
        int k = 0, f = 1; char c = getchar();
        while(c < '0' || c > '9'){
            if(c == '-') f = -1;
            c = getchar();
        }
        while(c >= '0' && c <= '9'){
            k = k * 10 + c - 48; c = getchar();
        }
        return k * f;
    }
    int val[1000010], size[1000010], ans;
    struct zzz {
        int l, r;
    }node[1000010];
    int dfs(int pos) {//
        if(pos == -1) return 0;
        size[pos] = dfs(node[pos].l) + dfs(node[pos].r) + 1;
        return size[pos];
    }
    bool duichen(int ls, int rs) {//判断对称
        if(ls == rs && ls == -1) return 1;
        if(val[ls] == val[rs] && size[ls] == size[rs] && duichen(node[ls].l, node[rs].r) && duichen(node[ls].r, node[rs].l))
            return 1;
        return 0;
    }
    int main(){
        int n = read();
        for(int i = 1; i <= n; ++i) val[i]=read();
        for(int i = 1; i <= n; ++i)
          node[i].l = read(), node[i].r = read();
        dfs(1);
        for(int i = 1; i <= n; ++i)
            if(duichen(node[i].l, node[i].r)) ans = max(ans, size[i]);
        printf("%d
    ", ans);
        return 0;
    }

    完结

  • 相关阅读:
    vue中在echarts tooltip中添加点击事件
    支配树
    mac安装protobuf
    mac安装 thrift
    Javascript设计模式读书笔记二 接口
    WebBrowser捕获网页关闭事件
    谈谈UserControl调用页面的几种方法
    屏蔽刷新提交后台
    [喜讯]Acey.ExcelX组件已发布在componentsource
    AceyOffice教程如何判断单元格的内容
  • 原文地址:https://www.cnblogs.com/lbssxz/p/11116449.html
Copyright © 2011-2022 走看看