P5018对称二叉树








题目说了那么多,到底什么是对称二叉树呢?
就是关于根节点左右镜面对称的二叉树辣。
当然,一棵对称二叉树的子树不一定是对称二叉树,就比如下面这个

它是对称二叉树,但是对于它的子树
这并不是对称二叉树
那怎么判断对称二叉树呢?
对于每一个节点,都进行一次搜索。
在搜索之前,我们可以处理出对任意的一个节点u,以u为根的子树的节点数,即以u为根的子树的大小。
搜索:
首先,如果当前节点 i 的左右子树的节点数不相等,或者是左右儿子的权值不相等,就可以不用继续搜索了,直接返回。
维护两个指针,一个指针指向i的左儿子的右儿子,一个指向右儿子的左儿子,然后再反过来。因为能到这一步,就说明i的左右儿子的权值相等,且左右子树大小相同,就不用管u,v了。

红色为第一次比较时指针的指向,蓝色为第二次比较时指针的指向。
如果y,z的权值相等,子树大小相同,x,l权值相等,子树大小相同,则继续向下搜索,否则就直接返回。(这里考虑子树大小是因为可能出现下面这种情况)

这样虽然u,v的子树大小相同,但是y,z的子树大小不同,所以要考虑子树。
%%%wxl用十几分钟讲完了这道题
代码:
#include <bits/stdc++.h>
using namespace std;
int n,son[][],node[],size[];
int read()
{
char ch=getchar();
int x=;bool f=;
while(ch<''||ch>'')
{
if(ch=='-')f=;
ch=getchar();
}
while(ch>=''&&ch<='')
{
x=(x<<)+(x<<)+(ch^);
ch=getchar();
}
f?x=-x:x=x;
return x;
}
void dfs(int x)//预处理子树大小(size)
{
size[x]=;
if(son[x][]!=-)
{
dfs(son[x][]);
size[x]+=size[son[x][]];
}
if(son[x][]!=-)
{
dfs(son[x][]);
size[x]+=size[son[x][]];
}
}
bool check(int u,int v)//一个长成check的搜索
{
if(u==-&&v==-)return true;//注意如果左右儿子都不存在,那这是个叶节点,也是对称二叉树
if(size[u]!=size[v])return false;
if(u!=-&&v!=-&&node[u]==node[v]&&check(son[u][],son[v][])&&check(son[u][],son[v][]))//分别对上图的红色指针所对应的节点和蓝色指针所对应的节点进行判断
return true;
return false;//其他一些神奇的情况就直接返回false了
}
int main()
{
n=read();
for(int i=;i<=n;i++)
node[i]=read();
for(int i=;i<=n;i++)
{
son[i][]=read();
son[i][]=read();
}
dfs();
int ans=-;
for(int i=;i<=n;i++)
{
if(check(son[i][],son[i][]))//对所有的对称二叉树的节点取最大值
ans=max(ans,size[i]);
}
printf("%d",ans);
}
P5018对称二叉树的更多相关文章
- 2021.08.09 P5018 对称二叉树(树形结构)
2021.08.09 P5018 对称二叉树(树形结构) [P5018 NOIP2018 普及组] 对称二叉树 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 求一棵子树,关 ...
- 洛谷P5018 对称二叉树——hash
给一手链接 https://www.luogu.com.cn/problem/P5018 这道题其实就是用hash水过去的,我们维护两个hash 一个是先左子树后右子树的h1 一个是先右子树后左子树的 ...
- P5018 对称二叉树题解
题目内容链接: 那么根据题意,上图不是对称二叉树,只有节点7的子树是: 通俗来说,对称二叉树就是已一个节点x为根的子树有穿过x点的对称轴并且对称轴两边的对称点的大小也必须相等,那么这棵树就是对称二叉树 ...
- 洛谷P5018 对称二叉树
不多扯题目 直接题解= = 1.递归 由题目可以得知,子树既可以是根节点和叶节点组成,也可以是一个节点,题意中的对称二叉子树是必须由一个根节点一直到树的最底部所组成的树. 这样一来就简单了,我们很容易 ...
- NOIP2018普及T4暨洛谷P5018 对称二叉树题解
题目链接:https://www.luogu.org/problemnew/show/P5018 花絮:这道题真的比历年的t4都简单的多呀,而且本蒟蒻做得出t4做不出t3呜呜呜... 这道题可以是一只 ...
- Luogu P5018 对称二叉树 瞎搞树&哈希
我的天..普及组这么$hard$... 然后好像没有人用我的垃圾做法,,,好像是$O(n)$,但十分的慢,并且极其暴力$qwq$ 具体来说,就是直接$dfs$求出树高,然后想像出把原来的树补成满二叉树 ...
- 洛谷 P5018 对称二叉树(搜索)
嗯... 题目链接:https://www.luogu.org/problem/P5018 其实这道题直接搜索就可以搜满分: 首先递归把每个点作为根节点的儿子的数量初始化出来,然后看这个节点作为根节点 ...
- $P5018 对称二叉树$
problem 一直忘记给这个题写题解了. 这题挺水的吧. 挺后悔当时没写出来. #ifdef Dubug #endif #include <bits/stdc++.h> using na ...
- 【洛谷P5018 对称二叉树】
话说这图也太大了吧 这题十分的简单,我们可以用两个指针指向左右两个对称的东西,然后比较就行了 复杂度O(n*logn) #include<bits/stdc++.h> using name ...
随机推荐
- 浅谈vue对seo的影响
不可否定的是,vue现在火.但是在实际项目中,特别是像一下交互网站,我们不可避免会考虑到的是seo问题,这直接关系到我们网站的排名,很多人说用vue搭建的网站不能做优化,那我们真的要放弃vue,放弃前 ...
- SpringBoot(七) -- 嵌入式Servlet容器
一.嵌入式Servlet容器 在传统的开发中,我们在完成开发后需要将项目打成war包,在外部配置好TomCat容器,而这个TomCat就是Servlet容器.在使用SpringBoot开发时,我们无需 ...
- 旧接口注册LED字符驱动设备(静态映射)
#include <linux/init.h> // __init __exit #include <linux/module.h> // module_init module ...
- Kotlin学习(3)类
声明类和接口: //类 class A{ } //接口,接口中的方法可以有默认实现 interface B{ fun show(){ print("i'm B") } } //用冒 ...
- Gorgeous Sequence(线段树)
Gorgeous Sequence Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Othe ...
- P3188 [HNOI2007]梦幻岛宝珠
传送门 注意到 $a,b$ 不大 考虑对每一个 $a*2^b$ 的 $b$ 分别背包 设 $f[i][j]$ 表示只考虑 $b=i$ 的物品时,容量为 $j= \sum a$ 的最大价值 这个就是普通 ...
- 【学习总结】SQL学习总结
参考链接: 菜鸟教程: 一.认识sql 二.sql语法 三.sql高级教程 四.sql函数 一.认识SQL SQL是什么? SQL 是用于访问和处理数据库的标准的计算机语言. SQL,指结构化查询语言 ...
- 【JAVA】增强for循环for(int a : arr)
介绍 这种有冒号的for循环叫做foreach循环,foreach语句是java5的新特征之一,在遍历数组.集合方面,foreach为开发人员提供了极大的方便. foreach语句是for语句的特殊简 ...
- 自定义、操作cookie
/** * 读取所有cookie * 注意二.从客户端读取Cookie时,包括maxAge在内的其他属性都是不可读的,也不会被提交.浏览器提交Cookie时只会提交name与value属性.maxAg ...
- Python单例模式的设计与实现【完美版】
目录 1. 按 2. 本文地址 3. 通过继承单例父类来实现 4. 使用装饰器实现 4.1. 懒汉式 4.2. 饿汉式 4.2.1. 未加锁版 4.2.2. 加锁版 1. 按 众所周知,对象是解决继承 ...