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 ...
随机推荐
- SpringBoot 使用maven创建springboot项目
有两种方式可以创建 1是使用spring-boot-starter-parent ,2是使用spring-boot-dependencies (即父项目dependencyManagement) ( ...
- [Python3] 007 列表的遍历,你是 for 联盟还是 while 部落
目录 少废话,直接上例子 for 联盟 for 与 list 的简单合作 for 的老搭档 range() for 与嵌套列表(双层列表) for 从 if 那儿认识的 else 循环"三杰 ...
- Lpl and Energy-saving Lamps
During tea-drinking, princess, amongst other things, asked why has such a good-natured and cute Drag ...
- 哪吒票房超复联4,100行python代码抓取豆瓣短评,看看网友怎么说
<哪吒之魔童降世>这部国产动画巅峰之作,上映快一个月时间,票房口碑双丰收. 迄今已有超一亿人次观看,票房达到42.39亿元,超过复联4,跻身中国票房纪录第三名,仅次于<战狼2> ...
- P5443 [APIO2019]桥梁
传送门 子任务 $4$ 告诉我们可以离线搞带权并查集 从大到小枚举询问,从大到小连边 如果没有修改操作就可以过了 但是有修改,考虑最暴力的暴力,搞可撤销并查集 同样先离线,从大到小处理询问时,按原边权 ...
- 【JAVA】Java 异常中e的getMessage()和toString()方法的异同
参考链接 CSDN: Java 异常中e的getMessage()和toString()方法的异同 示例代码1: public class TestInfo { private static ...
- WPF的DataTrigger使用
首先创建一个空的项目 然后看看前台写的代码,如下图所示 <Grid> <StackPanel HorizontalAlignment="Center" Verti ...
- There is no Action mapped for namespace [/] and action name [TestAction] ass
1.修改action的name值 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE strut ...
- ASE Alpha Sprint - backend scrum 2
本次scrum于2019.11.5再sky garden进行,持续30分钟. 参与人: Zhikai Chen, Jia Ning, Haifeng Chen, Hao Wang 请假: Xin Ka ...
- Docker设置容器开机自启动
设置如下: docker update --restart=always 镜像ID 例如:docker update --restart=always e39a959d7bff. 参考:https:/ ...