【题目描述】

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

1.二叉树;

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

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

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

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

【输入】

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

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

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

【输出】

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

【输入样例】

2
1 3
2 -1
-1 -1

【输出样例】

1

【样例1说明】

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

【样例输入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

【样例2说明】

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

【数据规模与约定】

共 2525 个测试点。

vi≤1000vi≤1000。

测试点 1−31−3,n≤10n≤10,保证根结点的左子树所有节都没右孩子,根结点的右孩子,根结点的右子树的所有节点 都没有左孩子。

测试点 4−84−8,n≤10n≤10。

测试点 9−129−12,n≤105n≤105,保证输入是一棵 “满二叉树 ”。

测试点 13−1613−16,n≤105n≤105,保证输入是一棵 “完全二叉树 ”。

测试点 17−2017−20,n≤105n≤105,保证输入的树点权均为 11。

测试点 21−2521−25,n≤106n≤106。

本题约定:

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

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

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

满二叉树(深度为 3)

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

完全二叉树(深度为 3)

完全二叉树(深度为 3)


刚开始看到这道题的时候我居然傻乎乎的用指针去写!!!还邻接链表!真的够沙雕了( Ĭ ^ Ĭ )

然后在纸上写了一番后想到如果一棵二叉树的中序遍历是回文的话那就一定是对称二叉树,然鹅这道题并不是要我们判断某棵树是否为对称二叉树,而是要我们求给定的树的最大对称二叉子树的节点数!!所以我就gg了...然后脑子里一片空白,慌得一批

后来去网上看了别人的题解后觉得也不那么难嘛,直接跑暴力就能过!!ε=(´ο`*)))唉现在说什么都晚了,那个时候怎么就没想到呢

直接上代码:

 #include <bits/stdc++.h>
using namespace std;
const int SIZE=;
const int INF=0x3f3f3f3f;
#define ll long long struct Tree{
int v,Left_Child,Right_Child;
}tree[SIZE]; void DFS(int L,int R); int n,sum=,ans=;
bool F=true; int main()
{
scanf("%d",&n);
for (int i=;i<=n;i++) scanf("%d",&tree[i].v);
for (int i=;i<=n;i++) scanf("%d%d",&tree[i].Left_Child,&tree[i].Right_Child); for (int i=;i<=n;i++){
F=true;
sum=;
DFS(tree[i].Left_Child,tree[i].Right_Child);
if (F) ans=max(ans,sum);
} cout<<ans; return ;
} void DFS(int L,int R)
{
if (F==false) return;
if (L==- && R==-) return;
if ((L==- && R!=-) || (L!=- && R==-)){
F=false;
return;
} if (tree[L].v==tree[R].v){
sum+=;
DFS(tree[L].Left_Child,tree[R].Right_Child);
DFS(tree[L].Right_Child,tree[R].Left_Child);
}
else{
F=false;
return;
}
}

再来个详细点的:

 #include<bits/stdc++.h>
using namespace std;
int v[],lc[],rc[],cn[];
int n,mi,nu;
bool f;
int read()
{
char c;int ff=;
while((c=getchar())<''||c>'')
if(c=='-')ff=-;
int num=c-'';
while((c=getchar())>=''&&c<='')
num=num*+c-'';
return ff*num;
}
int c(int i)
{
if(cn[i])return cn[i];
long long sum=;
if(lc[i]!=-)sum+=c(lc[i]);
if(rc[i]!=-)sum+=c(rc[i]);
return cn[i]=sum;
}
void work(int x,int y)
{
if(x==-&&y==-)return;
if(x==-||y==-||v[x]!=v[y])
{
f=false;return ;
}
work(lc[x],rc[y]);
work(rc[x],lc[y]);
}
int main()
{
freopen("tree.in","r",stdin);
freopen("tree.out","w",stdout);
cin>>n;
for(int i=;i<=n;i++)
v[i]=read();
for(int i=;i<=n;i++)
{
lc[i]=read();rc[i]=read();
}
int ans=;
for(int i=;i<=n;i++)
if(lc[i]!=-&&rc[i]!=-&&v[lc[i]]==v[rc[i]])
{
f=true;
work(lc[i],rc[i]);
if(f)ans=max(ans,c(i));
}
cout<<ans;
return ;
}

【18NOIP普及组】对称二叉树(信息学奥赛一本通 1981)(洛谷 5018)的更多相关文章

  1. P5018 [NOIP2018 普及组] 对称二叉树

    P5018 [NOIP2018 普及组] 对称二叉树 题目 P5018 思路 通过hash值来判断左右树是否相等 \(hl[i]\) 与 \(Hl[i]\) 是防止hash冲突, \(r\) 同理 注 ...

  2. $ybt\ 【信息学奥赛一本通】题解目录$

    [信息学奥赛一本通]题解目录 $ \large -> OJ$ $ problem1000 $ \(Answer\) - > $ \large 1000$ $ problem1001 $ \ ...

  3. 【03NOIP普及组】栈(信息学奥赛一本通 1924)(洛谷 1044)

    #include<bits/stdc++.h> using namespace std; int n,ans,m,k,ans2; ],f[],d[][],num[][],tmp[],s[] ...

  4. 【00NOIP普及组】计算器的改良(信息学奥赛一本通 1910)(洛谷 1022)

    [题目描述] NCL是一家专门从事计算器改良与升级的实验室,最近该实验室收到了某公司所委托的一个任务:需要在该公司某型号的计算器上加上解一元一次方程的功能.实验室将这个任务交给了一个刚进入的新手ZL先 ...

  5. 【04NOIP普及组】火星人(信息学奥赛一本通 1929)(洛谷 1088)

    [题目描述] 人类终于登上了火星的土地并且见到了神秘的火星人.人类和火星人都无法理解对方的语言,但是我们的科学家发明了一种用数字交流的方法.这种交流方法是这样的,首先,火星人把一个非常大的数字告诉人类 ...

  6. 【03NOIP普及组】麦森数(信息学奥赛一本通 1925)(洛谷 1045)

    [题目描述] 形如2P-1的素数称为麦森数,这时P一定也是个素数.但反过来不一定,即如果P是个素数,2P-1不一定也是素数.到1998年底,人们已找到了37个麦森数.最大的一个是P=3021377,它 ...

  7. 【06NOIP普及组】数列(信息学奥赛一本通 1937)(洛谷 1062)

    [题目描述] 给定一个正整数k(3≤k≤15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当k=3时,这个序列是: 1,3,4,9,10,12,13,… (该序列实际上 ...

  8. 【00NOIP普及组】税收与补贴问题(信息学奥赛一本通 1911)( 洛谷 1023)

    [题目描述] 每样商品的价格越低,其销量就会相应增大.现已知某种商品的成本及其在若干价位上的销量(产品不会低于成本销售),并假设相邻价位间销量的变化是线性的且在价格高于给 定的最高价位后,销量以某固定 ...

  9. 【09NOIP提高组】Hankson 的趣味题(信息学奥赛一本通 1856)(洛谷 1072)

    题目描述 Hanks 博士是BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫Hankson.现在,刚刚放学回家的Hankson 正在思考一个有趣的问题.今天在课堂上,老师讲解了如何求 ...

随机推荐

  1. java之spring mvc之helloworld

    这篇主要讲解springmvc的基本的使用,这里以helloworld项目为例. 目录结构: 1. 新建 web 项目 :springmvc_helloworld 2. 在 WebRoot\WEB-I ...

  2. C#类型成员:构造函数

    一.构造函数 构造函数是类的特殊方法,它永远不会返回值(即使是void),并且方法名和类名相同,同样支持重载.在使用new关键字创建对象时构造函数被间接调用,为对象初始化字段和属性的值. 无参构造函数 ...

  3. Java之路---Day04

    2019-10-18-21:35:36 面向对象 学面向对象前要先知道什么叫面向过程,了解了什么叫面向过程才容易理解面向对象 面向过程(强调步骤) 概念:当需要实现一个功能的时候,每一个具体的步骤都要 ...

  4. $.get、$.post、$getJSON、$ajax。

    当我们用javascript写ajax程序写得很“开心”的时候,突然有人告诉你有一种东西叫jquery,它会告诉你不直接和HttpRequest是多么的快乐,同时你再也不需要再烦恼纠结的ajax乱码问 ...

  5. nginx配置访问xx.com跳转www.xx.com

    二.在nginx里面配置 rewrite 规则.打开 Nginx.conf 文件找到server配置段:[以下是我的server配置段] 禁止IP地址访问 server{ listen 80 defa ...

  6. PHP实现财务审核通过后返现金额到客户

    应用场景: 有这么一个返现的系统,当前端客户发起提现的时候,后端就要通过审核这笔返现订单,才可以返现到客户的账号里. 来看看下面的截图 这里的业务场景就是经过两轮审核:销售审核,财务审核都通过后,后端 ...

  7. JAVA 容器配置 JVM 监控

    目前世面上较流行的JAVA容器工具有:tomcat,jboss,weblogic 在日常工作中,经常会遇到开发需要查看JVM相关信息,这时就需要开启JVM. 一.tomcat 1 修改jdk认证配置文 ...

  8. Seata 动态配置订阅与降级实现原理

    Seata 的动态降级需要结合配置中心的动态配置订阅功能.动态配置订阅,即通过配置中心监听订阅,根据需要读取已更新的缓存值,ZK.Apollo.Nacos 等第三方配置中心都有现成的监听器可实现动态刷 ...

  9. Win10 微软远程桌面很模糊是为什么?

    今天又查了一下,解决了问题,是 Intel 集显驱动引起的.在桌面右键 => 图形属性 => 在蓝色的 Intel 核芯显卡控制面板上选择“ 3D ” => 在“保守形态学抗锯齿”中 ...

  10. kafka安装测试报错 could not be established. Broker may not be available.

    修改 config 下配置文件 vim server.properties 配置本机ip listeners=PLAINTEXT://192.168.174.128:9092 执行命令时 bin/ka ...