首页 > 其他分享 >树的遍历顺序及其应用

树的遍历顺序及其应用

时间:2024-11-24 21:23:05浏览次数:6  
标签:遍历 DFS 子树 顺序 应用 节点 欧拉

树的遍历顺序及其应用

一、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

标签:遍历,DFS,子树,顺序,应用,节点,欧拉
From: https://www.cnblogs.com/lupengheyyds/p/18566391

相关文章

  • QListView 使用QSortFilterProxyModel 过滤后的Item 无法拖动改变顺序
    当使用QSortFilterProxyModel对QListView进行过滤时,拖动顺序的改变通常不会生效,因为QSortFilterProxyModel是只读的,不支持修改模型中的数据顺序。要解决这个问题,可以通过以下方法实现:操作源模型:在拖动和放置时,将操作应用于QSortFilterProxyModel的源模型(sourceModel)......
  • Nuxt.js 应用中的 webpack:change 事件钩子
    title:Nuxt.js应用中的webpack:change事件钩子date:2024/11/24updated:2024/11/24author:cmdragonexcerpt:通过webpack:change钩子,开发者可以知道哪些文件被修改,并可以进行适当的处理,比如重新加载相关模块,或更新用户界面等。categories:前端开发tags:Nuxt.js......
  • 使用命令行创建一个简单的 Maven Web 应用程序
    本教程将指导您通过命令行创建一个简单的MavenWeb应用程序。我们将使用最新版本的Java和依赖项。本指南将带您完成项目设置、添加必要依赖项、配置Web应用程序并运行它的整个过程。先决条件已安装JDK21已安装Maven一个Web浏览器第一步:生成Maven项目首先......
  • Python内置数据结构:列表篇:【】,list函数创建。列表创建常见遇到问题,索引,列表增删改查,常
    介绍:列表元组字典集合列表: 方括号【】和list函数是列表最常用的两种定义方式。我们暂且称列表内的东西为元素,列表内的元素以逗号分隔开。列表的初始化:空列表,有数值是列表的两种初始化情况。使用方括号创建列表:【】a=[]#创建了一个空列表并将其赋值给了a我们可以称a为一......
  • 基于 C# 的计算机视觉应用开发实战
    随着人工智能(AI)技术的不断发展,计算机视觉(ComputerVision)作为AI领域的一个重要分支,已经在各行各业得到了广泛的应用。从人脸识别、图像分类、目标检测,到自动驾驶、工业检测和医疗影像分析,计算机视觉在现代技术中的地位愈发重要。在这个过程中,C#作为一门强类型、面向对象的......
  • HTML5的页面可见性(Page Visibility)有哪些应用场景?
    HTML5的PageVisibilityAPI提供了监测页面当前是否对用户可见的功能。这在很多场景下都非常有用,可以优化性能、提升用户体验,并节省资源。以下是一些常见的应用场景:暂停/恢复资源密集型任务:当页面不可见时,可以暂停视频播放、动画渲染、轮询请求、Canvas绘制等资源密集型任......
  • 举例说明你对HTML5的ruby标签的理解,都有哪些应用场景?
    HTML5的<ruby>标签及其相关标签用于在东亚文字中添加注音或音标,例如中文汉字的拼音、日语汉字的假名注音等。它允许你将注音(rubytext)与基础文本(basetext)关联起来,通常显示在基础文本的上方或右侧。<ruby>元素本身并不显示任何内容,需要结合以下子元素使用:<rt>(rubytext)......
  • 第十章 JavaScript的应用
     JavaScript概述与核心特性深度解析在当今的网页开发领域,HTML和CSS技术构建出了信息丰富且样式美观的网页框架,但在交互性方面却存在明显局限。JavaScript的出现恰好弥补了这一短板,作为一种强大的脚本语言,它为网页注入了灵动的交互性与绚丽的特效,极大地提升了用户体验。......
  • 24最新多目标(MORBMO_PSORF)基于粒子群算法优化随机森林的多目标红嘴蓝鹊优化算法自变
    接代码定制,算法改进等任意多目标都可以用(目标个数可变)含约束的多目标优化vs不含约束的多目标优化带具体数学表达式(白箱)vs不带具体数学表达式的(灰箱)连续版本的多目标参数寻优vs离散版本的多目标参数寻优连续+离散组合版本的多目标参数寻优白箱模型+灰箱模型组合版本的多目......
  • 24最新多目标(MOCOA_PSORF)粒子群算法优化随机森林的多目标浣熊算法自变量寻优(反推最
    接代码定制,算法改进等任意多目标都可以用(目标个数可变)含约束的多目标优化vs不含约束的多目标优化带具体数学表达式(白箱)vs不带具体数学表达式的(灰箱)连续版本的多目标参数寻优vs离散版本的多目标参数寻优连续+离散组合版本的多目标参数寻优白箱模型+灰箱模型组合版本的多目......