[蓝桥杯知识学习] 树链

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序。

相关推荐
ASKED_201914 小时前
Langchain学习笔记一 -基础模块以及架构概览
笔记·学习·langchain
(❁´◡`❁)Jimmy(❁´◡`❁)15 小时前
Exgcd 学习笔记
笔记·学习·算法
云小逸16 小时前
【nmap源码学习】 Nmap网络扫描工具深度解析:从基础参数到核心扫描逻辑
网络·数据库·学习
盐焗西兰花19 小时前
鸿蒙学习实战之路-Reader Kit构建阅读器最佳实践
学习·华为·harmonyos
深蓝海拓19 小时前
PySide6从0开始学习的笔记(二十七) 日志管理
笔记·python·学习·pyqt
慎独41319 小时前
科学赋能,让孩子专注高效爱上学习
学习
LGL6030A19 小时前
Java学习历程26——线程安全
java·开发语言·学习
学历真的很重要20 小时前
【系统架构师】第二章 操作系统知识 - 第二部分:进程管理(详解版)
学习·职场和发展·系统架构·系统架构师
Nebula_g20 小时前
线程进阶: 无人机自动防空平台开发教程(更新)
java·开发语言·数据结构·学习·算法·无人机
星期五不见面21 小时前
机器人学习!(二)ROS2-节点(7)2026/02/03
学习