题目 对称二叉树

  
   题目描述

思路

  检查是否符合对称条件

    条件很简单——结构对称&&点权对称

    要做到点权对称其实也就顺便结构对称了

    于是条件可以简化为点权对称

    可以考虑并行搜索

 bool con(int l,int r) {
if(l == -&&r == -)
return ;
if(l == -||r == -)
return ;
if(w[l] == w[r])
if(check(l,r))
return ;
return ;
}
bool check(int x,int y) {
if(x == -&&y == -)
return ;
if(x == -||y == -)
return ;
if(w[x] != w[y])
return ;
int l = Root[x].l,l1 = Root[y].l;
int r = Root[y].r,r1 = Root[x].r;
if(con(l,r)&&con(l1,r1))
return ;
return ;
}

  信仰深搜

    就三个点

  

    你就装作上面还有一个点

  

 int dfs(int x) {
if(x == -) return ;
if(check(Root[x].l,Root[x].r)) {
int ans = Find(x) + ;
return ans;
}
int ans = max(dfs(Root[x].l),dfs(Root[x].r));
return ans;
}

  找答案

    加一指根节点

 int Find(int x) {
int q = ;
int l = Root[x].l;
int r = Root[x].r;
if(l != -) q += Find(l) + ;
if(r != -) q += Find(r) + ;
return q;
}

  另外
    读入时要记录这样几个玩意儿

  

     for(i = ;i <= n;i++)
scanf("%d",&w[i]);
for(i = ;i <= n;i++)
scanf("%d%d",&Root[i].l,&Root[i].r);

  code

 

 #include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define M 1000001
using namespace std;
int w[M];
struct N {
int l,r;
}Root[M];
bool con(int,int);
bool check(int,int);
//两个函数相互递归调用,并行搜索检查是否符合要求
int dfs(int);
//核心
int Find(int);
//其实就是找有多少个点
int main() {
int i,n;
scanf("%d",&n);
for(i = ;i <= n;i++)
scanf("%d",&w[i]);
for(i = ;i <= n;i++)
scanf("%d%d",&Root[i].l,&Root[i].r);
int ans = dfs();
printf("%d",ans);
return ;
} bool con(int l,int r) {
if(l == -&&r == -)
return ;
if(l == -||r == -)
return ;
if(w[l] == w[r])
if(check(l,r))
return ;
return ;
}
bool check(int x,int y) {
if(x == -&&y == -)
return ;
if(x == -||y == -)
return ;
if(w[x] != w[y])
return ;
int l = Root[x].l,l1 = Root[y].l;
int r = Root[y].r,r1 = Root[x].r;
if(con(l,r)&&con(l1,r1))
return ;
return ;
}
int Find(int x) {
int q = ;
int l = Root[x].l;
int r = Root[x].r;
if(l != -) q += Find(l) + ;
if(r != -) q += Find(r) + ;
return q;
}
int dfs(int x) {
if(x == -) return ;
if(check(Root[x].l,Root[x].r)) {
int ans = Find(x) + ;
return ans;
}
int ans = max(dfs(Root[x].l),dfs(Root[x].r));
return ans;
}

总结

    信仰很重要

    这代码很慢但不至于卡常,还有大量可优化地方,此处不再赘述

    它非常好理解,相信任何人都能写出比这更优秀的代码

2018NOIP普及T4---对称二叉树的更多相关文章

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

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

  2. [NOIP2018 PJ T4]对称二叉树

    题目大意:问一棵有根带权二叉树中最大的对称二叉树子树,对称二叉树为需满足将这棵树所有节点的左右子树交换,新树和原树对应位置的结构相同且点权相等. 题解:在对称二叉树中,对于深度相同的两个节点$u,v$ ...

  3. 2021.08.09 P5018 对称二叉树(树形结构)

    2021.08.09 P5018 对称二叉树(树形结构) [P5018 NOIP2018 普及组] 对称二叉树 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 求一棵子树,关 ...

  4. [Noip 2018][标题统计 龙湖斗 摆渡车 对称二叉树]普及组题解

    啊喂,都已经9102年了,你还在想去年? 这里是一个Noip2018年PJ第二题打爆的OIer,错失省一 但经过了一年,我学到了很多,也有了很多朋友,水平也提高了很多,现在回看当时: 今年的Noip ...

  5. 【18NOIP普及组】对称二叉树(信息学奥赛一本通 1981)(洛谷 5018)

    [题目描述] 一棵有点权的有根树如果满足以下条件,则被轩轩称为对称二叉树: 1.二叉树: 2.将这棵树所有节点的左右子树交换,新树和原树对应位置的结构相同且点权相等. 下图中节点内的数字为权值,节点外 ...

  6. LeetCode【101. 对称二叉树】

    对称二叉树,就是左节点的左节点等于右节点的右节点,左节点的右节点等于右节点的左节点. 很自然就想到迭代与递归,可以创建一个新的函数,就是另一个函数不断的判断,返回在主函数. class Solutio ...

  7. 【leetcode-101】 对称二叉树

    101. 对称二叉树 (1过) 给定一个二叉树,检查它是否是镜像对称的. 例如,二叉树 [1,2,2,3,4,4,3] 是对称的. 1 / \ 2 2 / \ / \ 3 4 4 3 但是下面这个 [ ...

  8. 【洛谷P5018】对称二叉树

    题目大意:定义对称二叉树为每个节点的左右子树交换后与原二叉树仍同构的二叉树,求给定的二叉树的最大对称二叉子树的大小. 代码如下 #include <bits/stdc++.h> using ...

  9. 判断对称二叉树 python代码

    对称二叉树的含义非常容易理解,左右子树关于根节点对称,具体来讲,对于一颗对称二叉树的每一颗子树,以穿过根节点的直线为对称轴,左边子树的左节点=右边子树的右节点,左边子树的右节点=左边子树的左节点.所以 ...

随机推荐

  1. Message: SyntaxError: unterminated string literal

    #Message: SyntaxError: unterminated string literalmytxt = words.replace('\n','').replace('\r','') js ...

  2. 10.6 Graph Test

    一套图论的练习题,各个方面都有挺好的 第一第二题有一定难度(来源POI),第三第四题比较水 但我并没考好 T1 特工 szp T2 洞穴 zaw T3 最短路 line T4 最小差异值 dvalue

  3. tyvj 1013 找啊找啊找GF

    题目大意: 有一个背包,里面的东西需要满足两个条件,不只是体积 求最多能装多少东西,这些东西的东西最小价值 思路: 双重背包 开两个数组,记录装的东西数量和价值 #include<iostrea ...

  4. 【POJ 1201】 Intervals

    [题目链接] 点击打开链接 [算法] 令sum(n)表示区间[1,n]中选了几个点 那么,显然有以下不等式 : 1. sum(n)- sum(n - 1) >= 0 2. sum(n) -  s ...

  5. Java IO流中 File文件对象与Properties类(四)

    File类 用来将文件或目录封装成对象 方便对文件或目录信息进行处理 File对象可以作为参数传递给流进行操作 File类常用方法 创建 booleancreateNewFile():创建新文件,如果 ...

  6. vue 简介

    Vue.js是一套构建用户界面的渐进式框架.采用自底向上增量开发的设计.Vue的核心值关注视图层非常容易与其他库和已有的项目整合.另外,Vue完全有能力驱动采用单文件组件和Vue生态系统支持的库开发复 ...

  7. ubuntu16.04 查看CPU是几核

    ubuntu 16.04下查看机器是cpu是几核的 几个cpu more /proc/cpuinfo |grep "physical id"|uniq|wc -l 每个cpu是几核 ...

  8. .gitignore(转载)

    转自:http://blog.csdn.net/liuqiaoyu080512/article/details/8648266 git 可以管理所有文件的变更, 但并不是所有文件都有意义. 大部分二进 ...

  9. bzoj 1707: [Usaco2007 Nov]tanning分配防晒霜【贪心||最大流(?)】

    洛谷上能过的最大流bzoj上T了--但是贪心做法明明在洛谷上比最大流要慢啊--如果是最大流的话就是裸题了吧 说一下贪心,就按照防晒霜排序,然后对每一个防晒霜选一头可以使用的且r最小的牛 就,没了. 贪 ...

  10. justify-content属性

    justify-content 用于设置或检索弹性盒子元素在主轴方向上的对齐方式. 属性值:flex-start 属性值:flex-end 属性值:center 属性值:space-between 属 ...