“把LCA 归约到RMQ时,对根树做完整树上 Euler 序:进入或返回一个顶点都记录该顶点与深度,得到顶点序列 $E$ 和深度数组 $D$,相邻深度恰差 $\pm1$。令 first$(v)…”
形式陈述 ​
三种序列 ​
对有根树运行深度优先搜索,其 preorder 让每节点出现一次;记录
DFS 返回前会完整处理孩子子树,因此子树连续。Entry/exit 序列每节点两次,适合进入加、退出减;完整 Euler walk 每条边走两次,长
直觉
DFS 把树的嵌套结构投影到时间轴:进入一个节点后,在离开它之前发生的所有首次访问恰好属于其子树;若把沿边返回父亲的动作也记录下来,数组深度便忠实画出树上上下移动。不同投影保留的信息不同,所以 preorder 的子树区间与完整 walk 的 LCA 区间不能混用。
例子与边界
真例 ​
根 1 的孩子为 2、3,2 的孩子为 4、5。preorder
无根树须先选根;换根改变祖先关系,link/cut 会破坏静态次序。动态 Euler-tour tree 是维护序列的数据结构,不是一次 DFS 数组。
对子树和可令扁平数组
对该树,4 与 3 的首次出现区间中最浅节点为 1,故 LCA 为 1;4 与 5 的对应区间最浅节点为 2。若使用 preorder 深度,回退父节点的记录消失,RMQ 归约会错。
三种序列的生成过程 ​
DFS 进入
例树完整 walk
推论与应用
子树与路径的数组化 ​
令 flat
任意
静态失效构造 ​
在根 1 下原有子树 2 的区间连续;执行 cut
参考资料
- Cormen et al., Introduction to Algorithms, 4th ed., MIT Press, 2022, DFS timestamps.
- Bender, Farach-Colton, “The LCA Problem Revisited,” 2000.