洛谷 P5018 对称二叉树

题目背景

NOIP2018 普及组 T4

题目描述

一棵有点权的有根树如果满足以下条件,则被轩轩称为对称二叉树:

  1. 二叉树;
  2. 将这棵树所有节点的左右子树交换,新树和原树对应位置的结构相同且点权相等。

下图中节点内的数字为权值,节点外的 idid 表示节点编号。

现在给出一棵二叉树,希望你找出它的一棵子树,该子树为对称二叉树,且节点数最多。请输出这棵子树的节点数。

注意:只有树根的树也是对称二叉树。本题中约定,以节点 TT 为子树根的一棵“子 树”指的是:节点TT 和它的全部后代节点构成的二叉树。

输入格式

第一行一个正整数 nn,表示给定的树的节点的数目,规定节点编号 1 \sim n1∼n,其中节点 11 是树根。

第二行 nn 个正整数,用一个空格分隔,第 ii 个正整数 v_ivi​ 代表节点 ii 的权值。

接下来 nn 行,每行两个正整数 l_i, r_ili​,ri​,分别表示节点 ii 的左右孩子的编号。如果不存在左 / 右孩子,则以 -1−1 表示。两个数之间用一个空格隔开。

输出格式

输出文件共一行,包含一个整数,表示给定的树的最大对称二叉子树的节点数。

输入输出样例

输入 #1复制

2 
1 3 
2 -1 
-1 -1 

输出 #1复制

1

输入 #2复制

10 
2 2 5 5 5 5 4 4 2 3 
9 10 
-1 -1 
-1 -1 
-1 -1 
-1 -1 
-1 2 
3 4 
5 6 
-1 -1 
7 8

输出 #2复制

3

说明/提示

样例 1 解释


最大的对称二叉子树为以节点 22 为树根的子树,节点数为 11。

样例 2 解释

最大的对称二叉子树为以节点 77 为树根的子树,节点数为 33。

数据规模与约定

本题约定:

层次:节点的层次从根开始定义起,根为第一层,根的孩子为第二层。树中任一节 点的层次等于其父亲节点的层次加 11。

树的深度:树中节点的最大层次称为树的深度。

满二叉树:设二叉树的深度为 hh,且二叉树有 2^h-12h−1 个节点,这就是满二叉树。

完全二叉树:设二叉树的深度为 hh,除第 hh 层外,其它各层的结点数都达到最大 个数,第 hh 层所有的结点都连续集中在最左边,这就是完全二叉树。

本题注意:

空数也是对称二叉树。

在判断数是否是对称二叉树时,需要定义两个树,分别判断两棵树是否为空树。

如果两棵树都为空数,直接return true;

如果两棵树一棵为空树,另一棵为非空树,肯定不是对称的,直接return false;

如果两个条件都满足,判断树的权值是否相等,如果不等,直接return false;

继续判断它们的子树是否满足条件。

使用一个函数计算子树的值。特别注意:要加上一(根节点);

判断是否对称代码如下:

bool same(int now1,int now2){if(now1==-1 && now2==-1){return true;}if(now1==-1 || now2==-1){return false;}if(bt[now1].val!=bt[now2].val){return false;}return same(bt[now1].left,bt[now2].right)	&&	same(bt[now1].right,bt[now2].left);
} 

计算结点个数代码如下:

int cum(int now){if(now==-1){return 0;}return 1+cum(bt[now].left)+cum(bt[now].right);
}

完整代码如下:

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+2;
struct node{int left,right;		//left表示左子树,right表示右子树;int val;		//val表示每个结点的权值; 
} bt[N];
bool same(int now1,int now2){if(now1==-1 && now2==-1){return true;}if(now1==-1 || now2==-1){return false;}if(bt[now1].val!=bt[now2].val){return false;}return same(bt[now1].left,bt[now2].right)	&&	same(bt[now1].right,bt[now2].left);
} 
int cum(int now){if(now==-1){return 0;}return 1+cum(bt[now].left)+cum(bt[now].right);
}
int main(){int n,ans=0;scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&bt[i].val);}for(int i=1;i<=n;i++){scanf("%d %d",&bt[i].left,&bt[i].right);} for(int i=1;i<=n;i++){if(same(i,i)){ans=max(ans,cum(i));}}cout<<ans<<endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/538946.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot中RestTemplate 发送http请求

SpringBoot中RestTemplate 发送http请求 引入fastjson <!--fastjson--> <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>2.0.47</version> </dependency>创建配置文件 新建c…

【JAVA重要知识 | 第六篇】Java集合类使用总结(List、Set、Map接口及常见实现类)以及常见面试题

文章目录 6.Java集合类使用总结6.1概览6.1.1集合接口类特性6.1.2List接口和Set接口的区别6.1.3简要介绍&#xff08;1&#xff09;List接口&#xff08;2&#xff09;Set接口&#xff08;3&#xff09;Map接口 6.2Collection接口6.3List接口6.3.1ArrayList6.3.2LinkedList—不常…

谷歌浏览器扩展 Chandlery for Fallen London 1.4 下载方式

这边 可以直接下载我的资源 Chandlery for Fallen London 1.4 下载好后 打开到最底下 一层 就会 看到这个 anhebaghddcipcnlgoehajobofkgghje_v1.4.crx 首先 我们打开 谷歌浏览器 然后 选择 右上角这三个点 然后 然后 选择 扩展程序 下面的 管理扩展程序 然后 要确保 开发者…

使用docker搭建ELK进行日志收集

目录 docker安装es docker安装kibana 为es配置中文分词器 安装原生logstash 项目服务集成日志收集 为es设置登录密码 为kibana设置登录密码 为es容器设置内存限制 使用htop或者是docker进行内存使用查询 docker安装es 与自己的springBoot版本适配即可&#xff0c;下面…

MySQL删除数据 文件大小不变的原因以及处理空洞问题

数据删除流程 InnoDB 里的数据都是用 B 树的结构组织的。 假设&#xff0c;我们要删掉 R4 这个记录&#xff0c;InnoDB 引擎只会把 R4 这个记录标记为删除。如果之后要再插入一个 ID 在 300 和 600 之间的记录时&#xff0c;可能会复用这个位置。但是&#xff0c;磁盘文件的大…

蓝桥杯(1):python排序

1 基础 1.1 输出 1.1.1 去掉输出的空格 print("Hello","World",123,sep"") print("hello",world,123,sep) print(hello,world,123) #输出结果 #HelloWorld123 #helloworld123 #hello world 123 1.1.2 以不同的方式结尾 print(&quo…

配置阿里云加速器

国内镜像中心常用阿里云或者网易云。在本地docker中指定要使用国内加速器的地址后&#xff0c;就可以直接从阿里云镜像中心下载镜像。 2024阿里云-上云采购季-阿里云 [rootlocalhost /]# mkdir -p /etc/docker [rootlocalhost /]# tee /etc/docker/daemon.json <<-EOF &…

使用电脑的时候最怕有英文?微信的这个功能一定要用起来!

相信各位小伙伴对微信都不陌生。我们平常使用微信的大部分时间都是聊天、朋友圈、视频号等。 如果有人给你发来一张全英文图片的截图&#xff0c;你会咋整&#xff1f; 请人翻译&#xff1f;这个显然不需要。 一个个字母手打上去&#xff1f;这字数少了还行&#xff0c;但多了…

【MIT 6.S081】2020, 实验记录(8),Lab: locks

目录 Task 1&#xff1a;Memory allocator (moderate)</font>Task 2&#xff1a;Buffer cache (hard)</font> Task 1&#xff1a;Memory allocator (moderate) 这个任务就是练习将一把大锁拆分为多个小锁&#xff0c;同时可以更加深入地理解 memory allocator 运行…

闲鱼月入过万的不密心法

大家好&#xff0c;我是周萝卜 再介绍一下我自己 【我叫】周萝卜 【坐标】江苏南京 【个人标签】互联网深度玩家/技术公众号运行者/个人成长/闲鱼知乎运营 【个人事件】 公众号累计4万粉丝&#xff0c;累计变现6位数 个人分享号&#xff1a;#公众号&#xff1a;萝卜的个…

docker小白第十二天

docker小白第十二天 docker network简介 docker不启动时默认的网络情况。 # 停止docker服务 systemctl stop docker.socket systemctl stop docker # 查看docker镜像 docker images输入查看docker镜像命令后&#xff0c;显示未连接到docker服务器 docker启动时网络情况 sy…

【ArcGIS 脚本工具】修改多个布局的同一文本元素

规划编制的战线有多长&#xff0c;估计各位规划人已经深有体会了。 以村规为例&#xff0c;不服务个两年别想跑哈。其他规划编制时间更长&#xff0c;以至于图纸右下角的年月也是改了又改。 本着分散改不如统一改&#xff0c;手动改不如自动改的原则&#xff0c;小编制作了这个…