树的遍历顺序及其应用

news/2025/2/24 13:13:36/文章来源:https://www.cnblogs.com/lupengheyyds/p/18566391

树的遍历顺序及其应用

一、DFS 序

DFS 序就是以 DFS 的方式,记录每一个节点第一次被访问的顺序,这种顺序形成一个形成一个长度为 \(n\) 的序列。主要被用来维护子树信息。有以下特点:

  • 对于任意一个点来说,其子树里所有点的 DFS 序是连续的,具体来讲, \(x\) 的子树的所有结点的 DFS 序组成集合恰好构成区间 \([dfn_x,dfn_x+siz_x-1]\)

  • 对于任意一个点来说,存在一条到叶子的路径使得路径上 DFS 序连续。

  • 祖先先于后代出现,即若 \(u\)\(v\) 的祖先,则 \(dfn_u<dnf_v\)

应用一:树链剖分

利用其链连续的特点,一棵树划分为一条条链。

应用二:DFS序优化树上依赖型背包

利用其子树连续的特点,直接做到直接”跳过“子树的贡献。

应用三:子树修改的维护

在DFS序上建立线段树,不多说。

应用四:DFS序求LCA

\(u\neq v\),则它们的 LCA 等于 DFS 序上位置在 \([dfn_u + 1, dfn_v]\) 的深度最小的任意结点的父亲。若 \(u = v\),则它们的 LCA 就等于 \(u\)

二、括号序

括号序就是以 DFS 的方式,记录第一节点第一次及最后一次被访问到的顺序,叶子节点也会记录两次,这种顺序形成一个长度为 \(2n\) 的序列。主要被用来维护链信息。有以下特点:

  • 一个点被遍历两次视作退出子树,于是可以根据遍历的次数统计链信息,需要特判LCA。

应用一:树上莫队

利用括号序将树上问题转为区间问题从而使用莫队。

三、欧拉序

欧拉徐就是以DFS序的方式,记录每一次被访问到的顺序,一个节点会被算度数次,根节点额外再算一次。这种顺序形成一个长度为 \(2n-1\) 的序列。有以下特点:

  • 记录了完整的遍历顺序,可以推导出DFS序与括号序。

  • 遍历序列中任何相邻的位置都成父子关系,分为向下与向上两种。

  • 任何两点之间的深度最小的节点恰为其 LCA

  • 取出根节点的额外一次,任何以一个节点的为根的欧拉序都是以一个特定的节点的欧拉序的循环同构。

应用一:欧拉序求LCA

很简单,就是查两个节点第一次遍历到的编号之间的区间欧拉序最小的节点。

应用二:欧拉序状压DP

方法:设 \(dp_{i,s}\) 表示考虑欧拉序小于等于 \(i\) 的所有节点,其中欧拉序为 \(i\) 的点 \(x\) 到根节点的选择情况为 \(s\) 时的信息。

优势:相邻的两个位置只有向上与向下两种,在于每次是添加叶子节点,往往只需要考虑者单个节点的贡献,而传统的子树 DP 可以看作添加根合并多棵树,往往需要考虑合并子树的复杂度,在合并复杂度高(比如背包)或不能合并的时候考虑。

劣势:由于需要从下还原回上面,所以需要记录到根节点的所有点的状态。导致带一个\(O(2^{dep})\) 的复杂度。常常需要考虑如何减小树高。

应用三:求换根欧拉序

这样子以 \(1\) 为根的欧拉序为:2321565141。

将这串欧拉序延长一倍:123215651412321565141

那么换做是以 \(5\) 为根呢?欧拉序为刚才那个两倍串中标粗的一段:

123215651412321565141、123215651412321565141 这两个都是以 \(5\) 为根的合法括号序

应用四:欧拉序维护直径

例题:Dynamic Diameter

两点之间的距离公式为 \(dis(u,v)=dep_u+dep_v-2dep_{lca(u,v)}\),加上欧拉序的第三条性质,假设节点 \(x\) 一个遍历的顺序为 \(p_x,a_{p_x}=dep_x\),则 \(dis_{u,v}=\max_{a_u\le i\le a_v}\{a_{p_x}+a_{p_y}-2a_i\}\)

所以直径 \(D=\max(a_x+a_y-2\min_{i=x}^ya_i)=\max_{x\le i\le y}(a_x+a_y-2a_i)\)。用线段树维护即可。

四、BFS序

BFS序是以BFS的方式,记录每个节点被遍历的顺序,层序遍历是其按深度存储的一种特殊情况。有以下特点:

  • 对于任意节点,其儿子遍历相邻。

应用一:维护邻域信息

先将无根树定根,用线段树维护儿子信息,再特判父亲。

例题:Chain Queries

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/840562.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

视野修炼-技术周刊第111期 | 读文件 API 性能对比

① Node.js 与 Bun 读取文件速度对比 ② 2024 HTML现状调研 ③ Viselect - 直观的 DOM 选择 ④ fraction.js - 精确的十进制运算库 ⑤ npmpackage.info - 在线查看 npm 包相关概览信息 ⑥ dive - 展示 docker 镜像里层的内容 ⑦ lcl.host - 一键本地生SSL证书 ⑧ 12 个现代CSS技…

[CPP]继承

继承友元关系不能继承,也就是说基类友元不能访问子类私有和保护成员。 基类定义了static静态成员,则整个继承体系里面只有一个这样的成员。无论派生出多少个子类,都只有一个static成员实例。什么是继承 继承是面向对象编程(OOP)中的一个重要概念,它是一种创建新类(称为派…

MIT 操作系统6.S081第一章

1.1进程和内存 fork 父进程中 fork 返回 子进程的PID 子进程中 fork 返回 0 exit exit会让当前进程停止执行并释放资源(包括内存和打开的文件) 通常: 0 表示 成功 1 表示 失败 wait wait 系统调用并返回当前进程已退出或杀死的进程PID,并将子进程的状态复制到wait的地址 另…

TIA 做交通信号灯控制练习1

练习一下交通信号灯程序,从简单的功能做起。红绿黄等交替亮起。使用TIA编程,做成FB。新建一个TIA项目,选择一个1200CPU. 1. 新建一个FB,在新建的FB,先配置输入输出变量。 2. 在FB写下面的程序3. 在WINCC上建立1200?1500的变量连接,连接博图模拟器,建立变量。4.WINCC画…

Nuxt.js 应用中的 webpack:change 事件钩子

title: Nuxt.js 应用中的 webpack:change 事件钩子 date: 2024/11/24 updated: 2024/11/24 author: cmdragon excerpt: 通过webpack:change钩子,开发者可以知道哪些文件被修改,并可以进行适当的处理,比如重新加载相关模块,或更新用户界面等。 categories:前端开发tags:N…

HCIA-04 IP层及IP地址规划

详细介绍了IP地址规划的相关知识,包括IP地址的基本概念、格式、版本、头部字段、服务类型、分片机制、生存时间(TTL)以及IP地址分类等。特别强调了子网划分的重要性及其应用场景,通过实例演示了如何进行子网划分计算,包括子网数量、IP地址数量及每个子网的地址范围等。此外…

【MX-S7】梦熊 NOIP 2024 模拟赛 3 SMOI Round 2(同步赛)

【MX-S7】梦熊 NOIP 2024 模拟赛 3 & SMOI Round 2(同步赛)\(T1\) luogu P11323 【MX-S7-T1】「SMOI-R2」Happy Card \(20pts\)发现可以把「炸弹」也看做「三带一」。先使用「三带一」带走原用于出「单牌」的牌,若「三带一」还有剩余则尝试带走原用于出「对子」的牌,否…

Arthas的安装与使用

Arthas的安装与使用 简介Arthas是一款线上监控诊断产品,通过全局视角实时查看应用load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常、监测方法执行耗时,类加载信息等,大大提升了线上问题排查效率。下载 …

vxe-table 设置单元格对齐方式,左对齐、右对齐

官网:https://vxeui.com/<template><div><vxe-tableborderheader-align="center"align="left":data="tableData"><vxe-column type="seq" width="70"></vxe-column><vxe-column field=&q…

高级语言程序第八次设计作业

这个作业属于哪个课程:https://edu.cnblogs.com/campus/fzu/2024C 这个作业要求在哪里: https://edu.cnblogs.com/campus/fzu/2024C/homework/13307 学号:102400128 姓名:吴俊衡 11.1 问题无11.2 问题无11.3 问题无11.6 问题无11.7 问题无12.1 问题无12.2 问题:不会怎么设…

问题待解决

model() 默认是 predict mode么,等价于 model.predict()? model 不指定 task 类型,默认是 detect task么

20222317 2024-2025-1 《网络与系统攻防技术》实验五实验报告

1.实验内容 (1)从www.besti.edu.cn、baidu.com、sina.com.cn中选择一个DNS域名进行查询,获取如下信息: ①DNS注册人及联系方式 ②该域名对应IP地址 ③IP地址注册人及联系方式 ④IP地址所在国家、城市和具体地理位置 (2)尝试获取BBS、论坛、QQ、MSN中某一好友的IP地址,并…