2018NOIP普及T4---对称二叉树
题目 对称二叉树
思路
检查是否符合对称条件
条件很简单——结构对称&&点权对称
要做到点权对称其实也就顺便结构对称了
于是条件可以简化为点权对称
可以考虑并行搜索
bool con(int l,int r) {
if(l == -&&r == -)
return ;
if(l == -||r == -)
return ;
if(w[l] == w[r])
if(check(l,r))
return ;
return ;
}
bool check(int x,int y) {
if(x == -&&y == -)
return ;
if(x == -||y == -)
return ;
if(w[x] != w[y])
return ;
int l = Root[x].l,l1 = Root[y].l;
int r = Root[y].r,r1 = Root[x].r;
if(con(l,r)&&con(l1,r1))
return ;
return ;
}
信仰深搜
就三个点

你就装作上面还有一个点
int dfs(int x) {
if(x == -) return ;
if(check(Root[x].l,Root[x].r)) {
int ans = Find(x) + ;
return ans;
}
int ans = max(dfs(Root[x].l),dfs(Root[x].r));
return ans;
}
找答案
加一指根节点
int Find(int x) {
int q = ;
int l = Root[x].l;
int r = Root[x].r;
if(l != -) q += Find(l) + ;
if(r != -) q += Find(r) + ;
return q;
}
另外
读入时要记录这样几个玩意儿
for(i = ;i <= n;i++)
scanf("%d",&w[i]);
for(i = ;i <= n;i++)
scanf("%d%d",&Root[i].l,&Root[i].r);
code
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define M 1000001
using namespace std;
int w[M];
struct N {
int l,r;
}Root[M];
bool con(int,int);
bool check(int,int);
//两个函数相互递归调用,并行搜索检查是否符合要求
int dfs(int);
//核心
int Find(int);
//其实就是找有多少个点
int main() {
int i,n;
scanf("%d",&n);
for(i = ;i <= n;i++)
scanf("%d",&w[i]);
for(i = ;i <= n;i++)
scanf("%d%d",&Root[i].l,&Root[i].r);
int ans = dfs();
printf("%d",ans);
return ;
} bool con(int l,int r) {
if(l == -&&r == -)
return ;
if(l == -||r == -)
return ;
if(w[l] == w[r])
if(check(l,r))
return ;
return ;
}
bool check(int x,int y) {
if(x == -&&y == -)
return ;
if(x == -||y == -)
return ;
if(w[x] != w[y])
return ;
int l = Root[x].l,l1 = Root[y].l;
int r = Root[y].r,r1 = Root[x].r;
if(con(l,r)&&con(l1,r1))
return ;
return ;
}
int Find(int x) {
int q = ;
int l = Root[x].l;
int r = Root[x].r;
if(l != -) q += Find(l) + ;
if(r != -) q += Find(r) + ;
return q;
}
int dfs(int x) {
if(x == -) return ;
if(check(Root[x].l,Root[x].r)) {
int ans = Find(x) + ;
return ans;
}
int ans = max(dfs(Root[x].l),dfs(Root[x].r));
return ans;
}
总结
信仰很重要
这代码很慢但不至于卡常,还有大量可优化地方,此处不再赘述
它非常好理解,相信任何人都能写出比这更优秀的代码
2018NOIP普及T4---对称二叉树的更多相关文章
- P5018 [NOIP2018 普及组] 对称二叉树
P5018 [NOIP2018 普及组] 对称二叉树 题目 P5018 思路 通过hash值来判断左右树是否相等 \(hl[i]\) 与 \(Hl[i]\) 是防止hash冲突, \(r\) 同理 注 ...
- [NOIP2018 PJ T4]对称二叉树
题目大意:问一棵有根带权二叉树中最大的对称二叉树子树,对称二叉树为需满足将这棵树所有节点的左右子树交换,新树和原树对应位置的结构相同且点权相等. 题解:在对称二叉树中,对于深度相同的两个节点$u,v$ ...
- 2021.08.09 P5018 对称二叉树(树形结构)
2021.08.09 P5018 对称二叉树(树形结构) [P5018 NOIP2018 普及组] 对称二叉树 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 求一棵子树,关 ...
- [Noip 2018][标题统计 龙湖斗 摆渡车 对称二叉树]普及组题解
啊喂,都已经9102年了,你还在想去年? 这里是一个Noip2018年PJ第二题打爆的OIer,错失省一 但经过了一年,我学到了很多,也有了很多朋友,水平也提高了很多,现在回看当时: 今年的Noip ...
- 【18NOIP普及组】对称二叉树(信息学奥赛一本通 1981)(洛谷 5018)
[题目描述] 一棵有点权的有根树如果满足以下条件,则被轩轩称为对称二叉树: 1.二叉树: 2.将这棵树所有节点的左右子树交换,新树和原树对应位置的结构相同且点权相等. 下图中节点内的数字为权值,节点外 ...
- LeetCode【101. 对称二叉树】
对称二叉树,就是左节点的左节点等于右节点的右节点,左节点的右节点等于右节点的左节点. 很自然就想到迭代与递归,可以创建一个新的函数,就是另一个函数不断的判断,返回在主函数. class Solutio ...
- 【leetcode-101】 对称二叉树
101. 对称二叉树 (1过) 给定一个二叉树,检查它是否是镜像对称的. 例如,二叉树 [1,2,2,3,4,4,3] 是对称的. 1 / \ 2 2 / \ / \ 3 4 4 3 但是下面这个 [ ...
- 【洛谷P5018】对称二叉树
题目大意:定义对称二叉树为每个节点的左右子树交换后与原二叉树仍同构的二叉树,求给定的二叉树的最大对称二叉子树的大小. 代码如下 #include <bits/stdc++.h> using ...
- 判断对称二叉树 python代码
对称二叉树的含义非常容易理解,左右子树关于根节点对称,具体来讲,对于一颗对称二叉树的每一颗子树,以穿过根节点的直线为对称轴,左边子树的左节点=右边子树的右节点,左边子树的右节点=左边子树的左节点.所以 ...
随机推荐
- 利用JProfile 7分析内存OOM
今天发现一个OOM问题,想来可能是有部分内存没有正确释放导致的 于是想到了之前使用的JProfile来分析一下 由于大概知道哪个类没有释放,可以在Memory Views里看一下对应的类有多少实例来确 ...
- 【Silverlight】Bing Maps学习系列(三):如何控制地图
[Silverlight]Bing Maps学习系列(三):如何控制地图 本篇主要介绍如何对地图的一些常用控制操作,包括地图加载模式.根据精度和纬度定位.变焦程度等. 一.动态设置地图加载模式 在本系 ...
- BZOJ_1493_[NOI2007]项链工厂_Splay
BZOJ_1493_[NOI2007]项链工厂_Splay Description T公司是一家专门生产彩色珠子项链的公司,其生产的项链设计新颖.款式多样.价格适中,广受青年人的喜爱. 最近T公司打算 ...
- 4.7.5 Efficient Construction of LALR Parsing Tables
4.7.5 Efficient Construction of LALR Parsing Tables There are several modifications we can make to A ...
- C++中虚析构函数的作用 (转载)
转自:http://blog.csdn.net/starlee/article/details/619827 我们知道,用C++开发的时候,用来做基类的类的析构函数一般都是虚函数.可是,为什么要这样做 ...
- 为什么JavaWeb项目要分层
首先让我们坐着时光机回到n年前的web开发.那个时候最早都是静态的html页面,后来有了数据库,有了所谓的动态页面,然后程序猿在编码的时候,会把所有的代码都写在页面上,包括数据库连接,包括事务控制,接 ...
- Vigenère密码 2012年NOIP全国联赛提高组(字符串模拟)
P1079 Vigenère 密码 题目描述 16 世纪法国外交家 Blaise de Vigenère 设计了一种多表密码加密算法――Vigenère 密 码.Vigenère 密码的加密解密算法简 ...
- [App Store Connect帮助]六、测试 Beta 版本(4.3) 管理 Beta 版构建版本:为 Beta 版构建版本提供出口合规证明
如果您没有完成出口合规证明,则该 Beta 版构建版本的状态为“缺少合规证明”.您可以在 TestFlight 部分中回答必需的出口合规证明问题. 必要职能:“帐户持有人”职能.“管理”职能或“App ...
- java 线程开元篇
学习java的读者都知道,Java的每个对象都会有默认的12个方法,这12个方法分别是 object() finalize() hashCode() equals() wait() wait(long ...
- 最简单的SPA(单页应用)实现
$(function(){ var replacePage = function(href, onFinish){ $.get(href,{},function(raw){ var data = ra ...