洛谷 P5018 对称二叉树
2024-09-07 05:18:50
题目传送门
解题思路:
先计算每个点的子树有多少节点,然后判断每个子树是不是对称的,更新答案。
AC代码:
#include<iostream>
#include<cstdio> using namespace std; struct kkk{
int l,r,v,len;
kkk() {l = -;r = -;}
}e[];
int n,ans; bool solve(int ls,int rs) {
bool p = ;
if(e[ls].v != e[rs].v) return false;
if((e[ls].l != - && e[rs].r == -) || (e[ls].l == - && e[rs].r != -) || (e[ls].r == - && e[rs].l != -) || (e[ls].r != - && e[rs].l == -)) return false;
if(e[ls].l != - && e[rs].r != -)
p = p & solve(e[ls].l,e[rs].r);
if(e[ls].r != - && e[rs].l != -)
p = p & solve(e[ls].r,e[rs].l);
return p;
} int dfs(int k) {
e[k].len = ;
if(e[k].l != -)
e[k].len += dfs(e[k].l);
if(e[k].r != -)
e[k].len += dfs(e[k].r);
return e[k].len;
} int main(){
scanf("%d",&n);
for(int i = ;i <= n; i++)
scanf("%d",&e[i].v);
for(int i = ;i <= n; i++)
scanf("%d%d",&e[i].l,&e[i].r);
dfs();
for(int i = ;i <= n; i++)
if(solve(e[i].l,e[i].r))
ans = max(ans,e[i].len);
printf("%d",ans);
return ;
}
//NOIP普及2018 T4
最新文章
- 【C#进阶系列】29 混合线程同步构造
- [moka同学转载]Yii2 中国省市区三级联动
- bzoj 2738 矩阵乘法
- Asp.Net远程调试
- 淘宝(阿里百川)手机客户端开发日记第六篇 Service详解(六)
- ueditor编辑器图片自定义存放目录及路径修改
- 用C++实现斐波那契数列
- php笔记(七)PHP类于对象之多态
- 使用了UnityEditor中的API,打包时却不能打包UnityEditor的问题
- Javascript 数组(Array)相关内容总结
- PAGELATCH_x 等待--转载
- OpenStack-Neutron-VPNaaS-代码
- mysql_pconnect 问题
- Oracle 数据库监听配置和服务
- [Spark][Python]DataFrame where 操作例子
- redis 一主二从三哨兵
- ubuntu + usb转RS232驱动
- 专访姚冬:All-in-One,智能时代下企业需要更快速的变革
- Centos7编译安装zabbix-4.0.1
- elasticsearch.in.sh优化内存