首页 > [NOIP2018]对称二叉树
头像 savage
发表于 2019-08-27 19:21:52
题目描述 一棵有点权的有根树如果满足以下条件,则被轩轩称为对称二叉树: 1. 二叉树; 2. 将这棵树所有节点的左右子树交换,新树和原树对应位置的结构相同且点权相等。 下图中节点内的数字为权值,节点外的 id 表示节点编号。 展开全文
头像 林思艺
发表于 2020-10-16 20:04:56
题意 给你一棵树,你需要找到它的一颗子树满足以下条件1.是一棵二叉树2.这棵树的所有节点的左右儿子交换位置,交换后新树和原树的结构及每个位置的点权没变。 分析 先预处理出每棵子树的大小,然后枚举以任意节点为子树的根。递归处理这棵树的正确性。当这个节点没有儿子直接返回。当有两个儿子且两个儿子的权相同时 展开全文
头像 DeNeRATe
发表于 2020-10-16 21:05:38
分析 一个非常自然的想法就是枚举每个节点作为对称二叉树的根然后左右遍历检查是否合格最后取一个max 那么这个时间复杂度是多少呢首先我们知道,若以为根节点那么只有当左右子树大小相等时可以向下遍历那么我们进而想,什么情况下会有最多的可以遍历的根呢当然就是完全二叉树的时候因为一个点会被遍历,当且仅当根为其 展开全文
头像 又在摸鱼的大熊猫很勤奋努力
发表于 2020-10-17 07:49:34
首先考虑最暴力的暴力,那就是对于每颗子树都检验一次,然后求一个最大值,那么这个时间复杂度大约是 的,所以考虑优化检验方式那么主要就是看 函数的实现了 bool Check(int L,int R) { if (L == -1 && R == -1)return 1; 展开全文
头像 Dear㉿You
发表于 2020-10-19 17:31:37
对称二叉树 分析 也没什么好说的。看个图。对于一个节点来说,如果他对称,那么他的每一个节点都一一对应。于是只要跑一遍每一个点及其子树,判断一下每个节点与其对应的节点是否相等(值相等,且子树大小相等)就行了 代码 #include<bits/stdc++.h> #define l 展开全文
头像 程序蒟蒻
发表于 2020-10-22 17:42:42
遍历二叉树,用一个check函数来判断是否是对称二叉树,注意,一旦地下有不是对称二叉树的整个那条树都不是了(刚开始一直理解错题了),用dfs遍历来获得每个父节点的子节点个数,并且统计出来,最后遍历节点,判断函数就可以了。注意:需要用到快读,否则会TLE #include<iostream> 展开全文
头像 QAQ天战QAQ
发表于 2020-01-13 14:02:04
include include include include include include using namespace std; inline int read(){ int x=0,f=1;char ch=getchar(); while (!isdigit(ch) 展开全文
头像 lifehappy
发表于 2020-10-18 20:35:22
对称二叉树 思路 递归就好了,确实,递归就好了 一个递归去dfs,另一个去递归check,check注意要对称进行左右子树的访问,然后整体复杂度因该是的。 代码 /* Author : lifehappy */ #include <bits/stdc++.h> using name 展开全文
头像 coco2009
发表于 2020-10-16 20:18:09
嘻嘻,这题是我做过的哟~(虽然我做时差不多做死了)附代码 #include<bits/stdc++.h> using namespace std; int n,s,Max; struct tree{int num,l,r;bool p;}a[1000005]; bool cmp(int 展开全文
头像 issue是云哥的小迷×呀
发表于 2020-10-19 18:24:25
月份的题目,现在又不会写了 暴力枚举每一个点作为堆成二叉树的根节点 这样看上去是的,但是却跑得飞快,跑不满 #include <bits/stdc++.h> using namespace std; const int maxn=2e6+19; int n,m,l[maxn],r 展开全文

等你来战

查看全部