题目 对称二叉树

  
   题目描述

思路

  检查是否符合对称条件

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

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

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

    可以考虑并行搜索

 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. spark hadoop 对比 Resilient Distributed Datasets

    hadoop 迭代消耗大 每次迭代启动一个完整的MapReduce作业 spark 首要目标就是避免运算时 过多的网络和磁盘IO开销 Resilient Distributed Datasets ht ...

  2. list集合去重复元素

    //set集合去重,不打乱顺序 public static void main(String[] args){ List<String> list = new ArrayList<S ...

  3. Oracle 10g 10.2.0.4的group by BUG |ORA-00979 not a GROUP BY expression|

    乍看 ORA-00979 not a GROUP BY expression 这个提示估计很快能将其定位为SQL语句写得有问题,实际上有可能你遇到了一个Oracle的BUG,这个BUG常见于10.2. ...

  4. 词典(二) 哈希表(Hash table)

    散列表(hashtable)是一种高效的词典结构,可以在期望的常数时间内实现对词典的所有接口的操作.散列完全摒弃了关键码有序的条件,所以可以突破CBA式算法的复杂度界限. 散列表 逻辑上,有一系列可以 ...

  5. bzoj 1679: [Usaco2005 Jan]Moo Volume 牛的呼声【枚举】

    直接枚举两两牛之间的距离即可 #include<iostream> #include<cstdio> #include<algorithm> using names ...

  6. [App Store Connect帮助]六、测试 Beta 版本(3.3)管理测试员:查看测试员信息

    如果您使用“TestFlight Beta 版测试”,您可以查看关于测试员的信息,并衡量测试员的参与度. 必要职能:“帐户持有人”职能.“管理”职能.“App 管理”职能.“开发者”职能或“营销”职能 ...

  7. 【React Native】React Native项目设计与知识点分享

    闲暇之余,写了一个React Native的demo,可以作为大家的入门学习参考. GitHub:https://github.com/xujianfu/ElmApp.git GitHub:https ...

  8. JAXB解析xml 的注解说明

      1.将 xml 文件中的各个节点和属性信息创建对应的Java模型 2.在Java模型中的创建与 xml 文件对应的节点和属性需要用注解来表示@XmlRootElement   将一个Java类映射 ...

  9. Java多线程(五)停止线程 在沉睡中停止线程

    在沉睡中停止线程会抛出异常 public class SleepInterruptDemo extends Thread { public void run() { super.run(); try ...

  10. CSS之背景设置、字体设置、文本设置

    <html> <head> <meta charset="utf-8"> <title>单行文本框与多行文本框</title& ...