![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
树
文章平均质量分 71
AC__dream
道阻且长,行则将至;行而不辍,未来可期!
展开
-
Check Inorder Traversals(前序、中序、后序的综合应用)
分析:这道题目还是比较复杂的,首先我们需要判断根据给定的前序遍历序列和后序遍历序列能否构造出二叉树,如果能,那么我们就再每次根据所给定的中序遍历和前序遍历序列来唯一地确定一棵二叉树并对应的求出后序遍历序列,然后与给定的后序遍历序列进行比较,前序遍历和后序遍历无法确定二叉树,那么就直接按照前序遍历和中序遍历进行构造二叉树并输出后序遍历序列即可,题意中已经明确的说出了输出形式,这里就不赘述了。,然后对于每个中序遍历序列,尝试使用给定的前序遍历序列构建一棵树,并在一行中输出这棵树的正确的后序遍历序列;原创 2023-03-29 11:52:24 · 327 阅读 · 1 评论 -
(蓝桥真题)网络分析(并查集+树上差分)
(蓝桥真题)网络分析(并查集+树上差分)原创 2023-03-05 19:44:17 · 116 阅读 · 0 评论 -
2022牛客多校六 B-Eezie and Pie (dfs)
给定一棵有根树,根为1,每个节点可以为它的 0 ~ 𝑑[𝑖] 级祖先贡献 1 的价值。求最终每个点的价值。原创 2022-08-06 20:22:04 · 136 阅读 · 0 评论 -
二叉树三种(前序中序后序)遍历方式(递归版和非递归版)
递归遍历二叉树比较容易理解,就直接按照遍历方式的定义来做就行了。关键是非递归遍历二叉树。先说一下递归遍历二叉树,三种序列遍历方式的大致结构是一样的,都是先递归遍历左子树,再递归遍历右子树,区别就在于访问节点的顺序不同,先序遍历是先访问根节点再访问左子树和右子树,所以是在一开始就输出节点值,而中序遍历是先访问左子树再访问根节点最后访问右子树,也就是说在递归遍历完当前节点左子树后进行当前节点值输出,而后序遍历是访问完当前节点左子树和右子树后再进行当前节点值的输出。而非递归遍历二叉树的实现过程的大体框架也原创 2022-05-10 17:44:57 · 2616 阅读 · 0 评论 -
(L2-006)树的遍历(由给定序列建树)
题目链接:PTA | 程序设计类实验辅助教学平台之前有一道给出中序遍历和前序遍历让求反转后的树的后序遍历,与这道题目差不多,但是比这道题目多了一个反转操作,详情见(L2-011)玩转二叉树(利用个给定序列建树)_AC__dream的博客-CSDN博客分析:我们知道后序遍历的方式是先遍历左右孩子最后遍历根,那么也就是说后序遍历序列的结尾是根,通过根可以把中序遍历分成三部分,一部分是根左边的,一个是根,另一部分是根右边的,然后我们再取后序遍历序列中倒数第二个,这又是右子树的一个根,按照这种方法,我们就是原创 2022-03-25 22:16:56 · 27 阅读 · 0 评论 -
(L2-011)玩转二叉树(利用个给定序列建树)
题目链接:PTA | 程序设计类实验辅助教学平台分析:这道题分为三个步骤:(1)根据中序遍历序列和前序遍历序列进行建树(2)将树进行反转(3)对树进行层序遍历先来说一下如何根据中序遍历序列和前序遍历序列进行建树,由前序遍历的方式我们可以知道,先遍历根然后依次遍历左孩子和右孩子,由于建树我们肯定是先建立根再依次建立孩子节点,所以我们直接按照给定的前序遍历进行一个一个插入树中即可(一开始为空树),而根节点刚好把中序遍历分为三部分,根左边的为左子树,根,根右边的为右子树,这样我们就可以进行原创 2022-03-25 21:34:40 · 211 阅读 · 0 评论 -
(L3-016)二叉搜索树的结构(建树+离散化)
题目链接:PTA | 程序设计类实验辅助教学平台输入样例:52 4 1 3 082 is the root1 and 4 are siblings3 and 0 are on the same level2 is the parent of 43 is the left child of 41 is the right child of 24 and 0 are on the same level100 is the right child of 3输出样例:Y原创 2022-03-25 15:27:01 · 317 阅读 · 0 评论 -
(L3-010)是否完全二叉搜索树(建树+bfs)
题目链接:PTA | 程序设计类实验辅助教学平台分析:这道题主要有三个步骤:建树->输出层序遍历->判断是否为完全二叉树先来说一下建树,建树这个比较简单,就是我们要进行插入一个新节点,那么每次就从根节点遍历,如果该节点还没有被建立那就把值放入当前节点,如果该节点已经被建立,那么就判断待插入节点与当前遍历节点的值的关系,如果待插入节点值小于当前节点值,这时候有两种情况,一种是当前节点有右子树,那么就递归进入右子树进行后续遍历,如果当前节点没有右子树,那么就直接给当前节点建一个右子树再进原创 2022-03-23 22:19:08 · 1281 阅读 · 0 评论 -
(2021上海站icpc)Life is a game(Kruscal重构树)
题目链接:登录—专业IT笔试面试备考平台_牛客网题意:给你一个图,图上有点权和边权,然后给你一个初始位置和初始能量,你每到达一个点都会获得该点的能量(也就是点权),但是你经过某条边的条件是你当前所拥有的能量大于等于该边权(你经过这条边后你的能量并不会减少,但是你的能量要大于等于该边权才能经过该边,每条边可以重复经过),给你多个询问,每个询问给你一个初始位置和初始能量,然后问你最多能获得的能量。分析:先来贪心地想一下这个问题,就是把我们当前可以到达的点看成一个连通块,那么我们现在拥有的能量就是整个连通原创 2022-03-05 19:34:59 · 824 阅读 · 0 评论 -
Kruskal重构树
用处:求有关两点间路径最大边权最小值和最小边权最大值问题以求两点路径最大边权最小值为例(n个节点)(以下性质及方法均只适用于按照求两点路径最大边权最小值的方法所重构的树)性质:每两个点的最近公共祖先的权值就是两点间路径最大边权最小值(边权从小到大排序)重构得到的图是一个大根堆(前提原来图是连通的)重构之后的树是2*n-1个节点,且节点编号为1~n的节点没有点权,而n+1~2*n-1的节点具有点权且点权为原来图中最小生成树的边权方法:首先先将图中所有边权从小到大排序,选取一条边,如原创 2022-03-05 18:29:34 · 418 阅读 · 0 评论 -
最近公共祖先(LCA)(树上倍增)
什么是最近公共祖先呢?其实这是在树上定义的,比如说x节点,那么x节点以及x节点的父节点以及x节点的父节点的父节点的……父节点,这都算是x的祖先,而公共祖先显然是对于两个节点而言的,就是一个节点同时是这两个节点的祖先,那么这个节点就是两个节点的公共祖先,最近公共祖先当然是离他们最近的公共祖先了。画个图来说明一下:...原创 2022-03-05 15:34:10 · 1474 阅读 · 0 评论 -
(2021上海站icpc)Edge Groups(树形DP)
题目链接:登录—专业IT笔试面试备考平台_牛客网题意比较简单,就是先给出一棵树的点及其边,然后让我们对其边进行分组,分组要求是任意两条边必须要有公共点,问我们一共的方案组数。这道题目是一道树形DP题目,我们令f[i]表示以i为根的子树中的合法方案数,我们先来思考一个问题,假如我们当前遍历到了节点x,我们应该怎么确定其子节点与x的连边与以子节点为根的子树的边分到一组呢还是与x的另一条边分为一组呢?其实我建议大家不要这样思考问题,这样会有很多种情况,我建议从下往上进行思考,比如说我现在已经遍历到了叶原创 2022-03-02 17:07:02 · 513 阅读 · 2 评论 -
P2585 [ZJOI2006]三色二叉树(建树+树形DP)
题目链接:[ZJOI2006]三色二叉树 - 洛谷分析:这道题与其他的与树相关的题不太一样,因为这个题并没有给出具体的点和边,而是只给出了每个节点的孩子个数,所以这也就要求我们需要先建立一棵满足题意的树,然后再进行正常的树形DP,先说一下如何建树:我们直接每次递归都新建一个节点,然后看该节点有几个孩子,如果没有孩子就直接返回,若只有一个孩子就递归调用其左孩子,如果有两个孩子,就依次递归调用其左右孩子,思路就是这样了,下面看看具体的建树代码:void build(int x,int len)原创 2022-02-26 19:03:09 · 583 阅读 · 0 评论 -
P2015 二叉苹果树(树形DP)
题目链接:二叉苹果树 - 洛谷原创 2022-02-26 11:09:11 · 479 阅读 · 0 评论 -
P1122 最大子树和(树形DP)
题目链接:最大子树和 - 洛谷分析:这道题目就是在树上求一个连通块,使得这个连通块上的所有数的和最大,这显然是用树形DP来解决的,我们令f[i]表示以i为根的子树中的最大美丽指数,更新f[i]也是通过他的所有孩子j,如果f[j]>0,就加上j这个分支,否则就不加。需要注意的一点就是最大值不一定包含根节点,所以说我们最大值一定要在过程中更新,其他就没什么了,下面上代码:#include<cstdio>#include<cstring>#include<原创 2022-02-25 20:49:49 · 395 阅读 · 0 评论 -
P1352 没有上司的舞会(树形DP)
题目链接:没有上司的舞会 - 洛谷这道题目可以说是树形DP的模板题了,由于上司与职员之间的关系图刚好是一棵树,所以我们令f[i][0]表示以i为根的子树中且i未参加的最大快乐指数,而f[i][1]表示以i为根的子树中且i参加的最大快乐指数,至于动态转移方程就是写在递归函数里面的,如果还有对常见树形DP更新方法不了解的小伙伴可以看下我之前的博客,我在里面详细介绍了树形DP的常见遍历方式,下面附上博客地址:常见树形dp递归更新方法_AC__dream的博客-CSDN博客,对于x的子节点j,可以进行如下更原创 2022-02-25 20:32:53 · 295 阅读 · 0 评论 -
(POJ - 1308)Is It A Tree?(树)
题目链接:1308 -- Is It A Tree?题意:多组输入,每次给你一些边,(0,0)是每次输出结尾标志,(-1,-1)是题目输出结尾标志,最后判断所给边是不是一棵树。这道题比较容易出错,一个是空节点也是一棵树,也就是直接输入0,0就是一棵树,第二种是节点未必连续,也就是说给了你一个节点是10,但是未必会有9这个节点,所以我们在过程中需要记录出现的节点都有哪些,其他就没什么了,直接用并查集进行判断就行下面是代码:#include<cstdio>#include<原创 2022-02-15 15:15:00 · 215 阅读 · 0 评论 -
(HDU-7136)Jumping Monkey(并查集+建树)
题目链接:Problem - 7136 (hdu.edu.cn)题目翻译:有一棵树有n个节点和n个−1使所有节点连接的边。每个节点i具有不同的权重ai。一只猴子在树上跳。在一次跳跃中,猴子可以从节点u跳到节点v,当且仅当av是从节点u到节点v的最短路径上所有节点中最大的节点时。一旦无法到达更多节点,猴子将停止跳跃。对于每个整数k∈[1,n],计算猴子从节点k开始可以到达的最大节点数。分析:考虑点权最大的那个结点(设为 ),显然不管从其他哪个结点开始跳一次,都可以到达u,且不能越过u,原创 2021-10-12 20:41:37 · 162 阅读 · 0 评论 -
Parsa‘s Humongous Tree(贪心+树形dp)
今天来给大家分享一道考察贪心的题目:Parsa has a humongous tree onnnvertices.On each vertexvhe has written two integerslvandrv.To make Parsa's tree look even more majestic, Nima wants to assign a numberavav(lv≤av≤rv) to each vertexvsuch that the beauty of ...原创 2021-08-13 11:32:39 · 9955 阅读 · 1 评论 -
常见树形dp递归更新方法
常见的树形dp递归更新方法有两种,一种是在递归完回溯的时候用子节点更新父节点,而另一种就是在递归过程中用父节点更新子节点。先来展现一下两种递归方式的模板差异:void dfs1(int x,int father)//用子节点更新父节点,在回溯过程中更新 { for(int i=h[x];i!=-1;i=ne[i]) { int j=e[i]; if(j==father) continue; dfs1(j,x); //此处放用子节点更新父节点代码 }}void dfs原创 2021-08-11 10:10:05 · 556 阅读 · 1 评论 -
树的直径的常见结论和技巧及其应用
这次我主要是想通过经典习题的分析来向大家说明树的直径中一些重要结论与技巧。先给出一道题:A school bought the first computer some time ago(so this computer's id is 1). During the recent years the school bought N-1 new computers. Each new computer was connected to one of settled earlier. Manage原创 2021-07-28 15:22:43 · 301 阅读 · 0 评论 -
最小生成树
首先来说一下什么是最小生成树:由V中的全部n个顶点和E中 n−1条边构成的无向连通子图被称为G的一棵生成树,其中边的权值之和最小的生成树被称为无向图G的最小生成树。我们通常有两种方法求最小生成树,一种是prim算法,另一种就是kruskal算法,下面我将对这两种算法进行介绍,首先我要说明的是这两种算法都是利用的贪心思想:prim(不断地加点)我们首先选取一个点,然后利用这个点来更新所有与这个点有边的点的距离,然后选取距离最小的那个点加入,不断地重复这个过程,直至把所...原创 2021-07-26 17:46:40 · 286 阅读 · 0 评论 -
树的直径两种求法
首先先介绍一下什么是树的直径,树的直径就是树中所有最短路经距离的最大值。求树的直径通常有两种方法,一种是通过两次搜索(bfs和dfs均可),另一种就是通过树形dp来求了。先来介绍一下用两次深搜来求树的直径:先从图上任意一点,搜索整棵树,找到距离该点最远的点,再用距离该点最远的点搜索一次,即可得到树的直径。证明我就不写了,给出一位大佬的博客地址,里面有很详细的证明https://zhuanlan.zhihu.com/p/115966044?from_voters_page=true原创 2021-07-26 09:37:57 · 5978 阅读 · 6 评论