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 基础 day05 webpack 3.x
什么是webpack webpack 是前端的一个项目构建工具, 它是基于 Node.js 开发出来的一个前端工具 借助于webpack这个前端自动化构建工具, 可以完美实现资源的合并.打包.压缩.混 ...
- [Git] 010 对 [Git 008] 的补充:实现 commit 不计次数
回顾:[Git] 008 status 与 commit 命令的补充 的 "2.4" [Git 008] 的 "2.4" 使用 git commit --ame ...
- [Web 前端] 019 css 定位之绝对定位与相对定位
1. 关于定位 我们可以使用 css 的 position 属性来设置元素的定位类型 postion 的设置项如下 设置项 释义 relative 生成相对定位元素元素所占据的文档流的位置不变元素本身 ...
- Elasticsearch安装及遇到的问题(CentOS 7.3 64位)
Elasticsearch安装 使用root用户创建一个其他用户,(elasticsearch不能在root账户下安装) # 添加一个名字是es工作组 groupadd es # 添加用户es设置密码 ...
- jsp自定义标签处理转义字符
sun公司提供的jstl虽然比较强大,但是开发中很难满足我们所有的需求,并且开发也禁止在jsp中写很多java代码,因此很多场景需要自己定义标签进行项目开发 sun提供的标签库引用方式:<%@t ...
- 【题解】Shortest Cycle
原题链接:CF1205B 题目大意 给定\(n\)个整数\(a_1,a_2,a_3, \dots ,a_n\),若\(i \neq j\)且\(a_i \land a_j \neq 0\),则 ...
- [面試題]C符號的優先順序
int x = 0; if (x = 0 || x == 0) printf("%dn", x); printf("%dn", x); 參考C的優先表, 其實就 ...
- Python学习第四十一天函数装饰器传参数的用法
在不改变函数的结构的基础,我们给函数加新的功能,用是函数装饰器,如果要给函数传递参数,那么应该怎么做呢 @timerdef test2(name,age): time.sleep(3) print(' ...
- JS补充笔记
<script> 函数: 普通函数: function func(){ } 匿名函数: setInterval("func()",5000); setInterval( ...
- bootstrap复习
菜单 <div class="row">下拉菜单/分裂菜单</div> <div class="dropdown btn-group&quo ...