• 洛谷 P5018 对称二叉树(搜索)


    嗯...

    题目链接:https://www.luogu.org/problem/P5018

    其实这道题直接搜索就可以搜满分:

    首先递归把每个点作为根节点的儿子的数量初始化出来,然后看这个节点作为根节点的那棵子树是不是对称的,然后在对称的子树中记录最大值。

    AC代码:

     1 #include<cstdio>
     2 #include<iostream>
     3 
     4 using namespace std;
     5 
     6 struct node{
     7     int l, r, v, len;
     8     node() {l = -1; r = -1;}
     9 } e[1000005];
    10 
    11 int n, ans;
    12 
    13 inline int dfs(int k){
    14     e[k].len = 1;
    15     if(e[k].l != -1) e[k].len += dfs(e[k].l);
    16     if(e[k].r != -1) e[k].len += dfs(e[k].r);
    17     return e[k].len;
    18 }//初始化子树大小 
    19 
    20 inline bool check(int ls, int rs){
    21     bool p = 1;
    22     if(e[ls].v != e[rs].v) return false;
    23     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;
    24     if(e[ls].l != -1 && e[rs].r != -1) p = p & check(e[ls].l, e[rs].r);
    25     if(e[ls].r != -1 && e[rs].l != -1) p = p & check(e[ls].r, e[rs].l);
    26     return p;
    27 }//判断是否对称 
    28     
    29 int main(){
    30     scanf("%d", &n);
    31     for(int i = 1; i <= n; i++) scanf("%d", &e[i].v);
    32     for(int i = 1; i <= n; i++) scanf("%d%d", &e[i].l, &e[i].r);
    33     dfs(1);
    34     for(int i = 1; i <= n; i++)
    35         if(check(e[i].l, e[i].r)) ans = max(ans, e[i].len);
    36     printf("%d
    ", ans);
    37     return 0;
    38 }
    AC代码
  • 相关阅读:
    mysql读写分离
    redis和memcached的区别(总结)
    MySQL常见面试题
    mysql查询优化
    mysql中enum类型
    ySQL性能优化的21个最佳实践 和 mysql使用索引
    如何选择mysql存储引擎
    Windows10右键添加"在此处打开命令窗口"
    centos7下安全访问远程服务器
    常用http/https以及socks5代理总结
  • 原文地址:https://www.cnblogs.com/New-ljx/p/11827637.html
Copyright © 2020-2023  润新知