![](https://img-blog.csdnimg.cn/20190918135101160.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
树
文章平均质量分 56
树
曼切斯特的流氓
007
展开
-
叶子节点(DFS)
【代码】叶子节点(DFS)原创 2023-04-26 21:16:16 · 99 阅读 · 0 评论 -
树形dp(例题)
这个要分析当前节点紧挨着的父节点,无非两种情况,第一种是其父节点向上最长,第二种是其父节点向下最长那么第二种情况需要讨论,如果父亲节点最长距离d1、次长距离d2,其中d1如果不经过儿子节点,那么儿子节点向上最长一定是max(up[父亲],d1)+w*(父亲儿子之间权值)*,如果d1经过儿子节点,那么d1无法使用,只能使用d2那么儿子向上最长就是max(up[父亲],d2)+w。从上图可以看出,每次要两个变量存放以u为根,最长路径d1,和次长路径d2,那么整个树的最长路径就有可能是d1+d2。原创 2023-04-13 21:59:14 · 175 阅读 · 0 评论 -
树上状态机
f(i,1) 中需要枚举每个点照亮父亲的情况 (i为父亲节点,j为子节点)每一条边至少选择一个点。0表示不选,1表示选。原创 2023-04-13 22:15:50 · 43 阅读 · 0 评论 -
景区导游(树上两点间距离(LCA不同写法))
【代码】树上两点间距离(LCA不同写法)原创 2023-04-17 17:37:03 · 142 阅读 · 0 评论 -
机房(树上两点间距离)
LCA倍增原创 2023-03-23 02:19:17 · 113 阅读 · 1 评论 -
最近公共祖先LCA倍增算法
LCA定义LCA(Least Common Ancestors):最近公共祖先即两个结点最近的公共祖先由上图可以看到 5号结点和7号结点的LCA为3号结点,9号结点和7号结点的LCA为7号结点。一般算法首先可以将两个结点统一到相同深度,然后一起向上一步一步走,直到他们踩到相同点,则该点为他们的LCA 。(树的深度:与根节点的距离则为树的深度,根节点的深度为0或者1,根据个人喜好设置)复杂度分析因为每次向上走一步,最多n个结点深度最大也就为n,所以最多也就走n步,复杂度为O(n)原创 2021-09-25 21:25:45 · 576 阅读 · 0 评论 -
树的重建--(根据前序遍历和中序遍历推出后序遍历)
Preorder:前序遍历是按照根–>左子树–>右子树的顺序进行递归遍历Inorder:中序遍历是按照左子树–>根–>右子树的顺序进行遍历Posorder:后序遍历是按照左子树–>右子树–>根的顺序进行遍历现在给出一个树的前序遍历和中序遍历,如何推出树的后序遍历呢?举个例子pre={1,2.3,4,5,6,7,8,9}in={3,2,5,4,6,1,8,7,9}根据前序遍历特点,可以直到树的根节点一定是前序遍历中第一个元素!在中序遍历找出根的位置,也原创 2021-04-16 12:57:27 · 639 阅读 · 0 评论 -
二叉树相关操作大全
描述二叉树通常我们用一个结构体,来描述二叉树,这样比数组更加方便,可以直接调用左右孩子,以及父亲结点相关代码:struct node{ int p,l,r;//父亲结点,左孩子,右孩子} T[30];//存放node结点数组结点深度在求结点深度时,我们通常用一个D[i]数组表示结点深度,然后从根节点递归求解深度,每次d+1,先考虑递归到底情况!相关代码:void setDepth(int u,int d){ if(u==NUL)return;//递归到底原创 2021-04-15 16:47:53 · 140 阅读 · 0 评论 -
多叉树(左孩子右兄弟)详细实现
多叉树定义有一个根节点多个孩子结点(不止2个孩子结点)相比于二叉树,只需要写一个结构体,在结构体中添加parent,left,right就可以表示整颗树,但是多叉树有多个孩子结点,无法仅用左右孩子做到!怎么做呢?我们利用"左孩子""右兄弟"的定义方法实现多叉树!我们仍然用一个结构体实现,结构体中仍然是parent,left,right,只不过定义与二叉树不同!在多叉树中left定义为:一个结点的最左边的孩子结点!在多叉树中right定义为:一个结点的相邻右侧的兄弟结点!图示:原创 2021-04-15 15:08:18 · 7639 阅读 · 0 评论 -
四分树(刘汝佳-紫书)
题目:题目链接如图所示,可以用四分图来表示一个黑白图像,方法是用根节点表示整幅图像,然后把行列个分成两等份,按图中的方式编号,从左到右对应4个子节点。如果某子节点对应的区域全黑或全白,则直接用一个黑节点或白节点表示;如既有黑又有白,则用一个灰节点表示,并且为这个区域递归建树。 给出两棵四分树的先序遍历,求二者合并(黑色部分合并)黑像素的个数(每幅图都是32X32的)。p表示灰节点,f表示黑节点,e表示白节点。样例输入:3ppeeefpffeefepefepeefepeeefpeefep原创 2021-04-01 22:06:21 · 396 阅读 · 0 评论 -
用数组遍历二叉树
小记一波用数组遍历二叉树,是竞赛中经常用的操作,有n个元素就要开2^n-1大小的数组,我们在算左右孩子下标时,要考虑数组是从0开始,还是1开始,如果从0左孩子为2index+1,不然为2index。右孩子同理。#include <bits/stdc++.h>using namespace std;vector<int> v(1000);//一定要开长度int n;void pre_order(int index){ if(index>=n)原创 2021-03-28 11:21:02 · 551 阅读 · 0 评论 -
小球下落(UVa679)
题目:许多的小球一个一个的从一棵满二叉树上掉下来组成一个新满二叉树,每一时间,一个正在下降的球第一个访问的是非叶子节点。然后继续下降时,或者走右子树,或者走左子树,直到访问到叶子节点。决定球运动方向的是每个节点的布尔值。最初,所有的节点都是 FALSE,当访问到一个节点时,如果这个节点是 FALSE,则这个球把它变成 TRUE,然后从左子树走,继续它的旅程。如果节点是TRUE,则球也会改变它为 FALSE,而接下来从右子树走。满二叉树的标记方法如下图。因为所有的节点最初为 FALSE,所以第一个球将会原创 2021-03-27 17:35:53 · 650 阅读 · 0 评论