[蓝桥杯知识学习] 树链

DFS序

什么是DFS序

怎么求DFS序

进入操作,将有计数++

出:可以理解为,没有孩子可以去了(不能,向下行动:对应于程序里的入栈),所以回到父结点(向上行动,对应于程序里的出栈)

总体行动:

  1. 进入结点,计数++,赋值:入=当前计数

  2. 如果可以向下,则重复1操作

  3. 如果没有可以向下的了,则,在当前结点:赋值出=当前计数,回到父结点,重复2操作

代码实现

我自己写的,更好懂

cpp 复制代码
//多叉树
int inn[100000];  //dfs入序
int out[100000];   //dfs出序
int weight[100000];  //权重
vector<int> edge[100000];  //用来放结点的子结点
int cnt;  //dfs序计数器

//生成dfs序
void dfs(int t,int f)
{
  inn[t] = ++cnt;
  for(int i = 0 ; i < edge[t].size() ; i++)
  {
    dfs(edge[t][i],t);
  }
  out[t] = cnt;
  return ;
}

其实就是三段论

用一个数组 in 存放该结点的入序,遍历这个结点所有的子结点,用一个数组 out 放出序

DFS序的性质

  1. 某些连续的入序对应树中的节点是一条链

2.某节点入序和出序之间对应的节点一定在其子树中

某结点的子树,其子树上的结点入序数都大于该结点,出序数都小于该结点。(这个好理解,要先进入这个结点,才能向下;向上的话,这个结点在最上方)

出序,一路退出,和最后进入的结点计数值相同

in[t] < t的子树的DFS序 < out[t]

例题

涉及到子树,所以用DFS序

解释,为什么第一个操作用的是 in[x] (某点的DFS序值),因为我们使用DFS序值当作数组下标,来记录点的点权,方便第二个操作的进行。

解释第二个操作:使用DFS序的第二个性质,in[x] 与 out[x] 之间是x子树结点的DFS序。

相关推荐
承渊政道13 分钟前
【优选算法】(实战体会位运算的逻辑思维)
数据结构·c++·笔记·学习·算法·leetcode·visual studio
AI-Ming35 分钟前
程序员转行学习 AI 大模型: 踩坑记录:服务器内存不够,程序被killed
服务器·人工智能·python·gpt·深度学习·学习·agi
m0_7167652338 分钟前
C++提高编程--STL常用容器(set/multiset、map/multimap容器)详解
java·开发语言·c++·经验分享·学习·青少年编程·visual studio
2501_9453184941 分钟前
零基础学习AI的选型指南:CAIE认证与编程型AI认证如何取舍
人工智能·学习
承渊政道1 小时前
【优选算法】(实战推演模拟算法的蕴含深意)
数据结构·c++·笔记·学习·算法·leetcode·排序算法
Keep learning!1 小时前
PCA主成分分析学习
学习·算法
浮白载笔的夜晚1 小时前
【科普向】模拟电路(Analog Circuits)与射频电路(RF Circuits)的区别
学习
Yilena2 小时前
带你轻松学习LangChain4j
java·学习·langchain
是翔仔呐2 小时前
第13章 SPI通信协议全解:底层时序、4种工作模式与W25Qxx Flash芯片读写实战
c语言·开发语言·stm32·单片机·嵌入式硬件·学习·gitee
是翔仔呐3 小时前
第14章 CAN总线通信全解:底层原理、帧结构与双机CAN通信实战
c语言·开发语言·stm32·单片机·嵌入式硬件·学习·gitee