洛谷 P5018 对称二叉树(搜索)
2024-10-08 12:20:26
嗯...
题目链接:https://www.luogu.org/problem/P5018
其实这道题直接搜索就可以搜满分:
首先递归把每个点作为根节点的儿子的数量初始化出来,然后看这个节点作为根节点的那棵子树是不是对称的,然后在对称的子树中记录最大值。
AC代码:
#include<cstdio>
#include<iostream> using namespace std; struct node{
int l, r, v, len;
node() {l = -; r = -;}
} e[]; int n, ans; inline 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;
}//初始化子树大小 inline bool check(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 & check(e[ls].l, e[rs].r);
if(e[ls].r != - && e[rs].l != -) p = p & check(e[ls].r, e[rs].l);
return p;
}//判断是否对称 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(check(e[i].l, e[i].r)) ans = max(ans, e[i].len);
printf("%d\n", ans);
return ;
}
AC代码
最新文章
- postman 断言解析
- 未能加载文件或程序集“XXX”或它的某一个依赖项。参数错误。 (异常来自 HRESULT:0x80070057 (E_INVALIDARG))
- oracle 模糊查询中的转义字符用法
- POJ 2184 01背包+负数处理
- NYOJ 61传纸条(一) 双线程DP问题
- paper 60 :转载关于视觉SCI期刊
- 《易货》Alpha版本项目展示
- 教你怎么把安卓应用软件放到系统根目录system/app下
- jquery validation 简单验证手机号码
- 2014年1月9日 Oracle常见授权与权限回收[转]
- Life is short, you need Python
- 摘要算法CRC8、CRC16、CRC32,MD2 、MD4、MD5,SHA1、SHA256、SHA384、SHA512,RIPEMD、PANAMA、TIGER、ADLER32
- HTTP基础知识(二)
- C# Split用法
- hibernate的一级和二级缓存
- MyBatis入门2
- Codeforces Round #525 (Div. 2) C. Ehab and a 2-operation task
- Python换行符问题:\r\n还是\n?
- vue-cli keep-alive用法以及activated,deactivated
- 【poj2396】 Budget