LCA 问题解法(Least Common Ancestor)
LCA = Least Common Ancestor
1. 倍增
先确定一点为根。
预处理出, 表示从开始往上跳,所到达的节点编号。
对于求解和的LCA:(假设其LCA为节点, 的儿子节点为)
我们先让它们跳到同一高度。
然后应注意这几个事实:和到所需要跳的长度是相等的。也就是说存在一个唯一的的二进制分解;
接下来要做的是从大到小枚举的次幂,对于, 如果和往上跳不相等,那就让和往上跳,即的二进制分解后第位为
2. 将树上 LCA 转化为序列 RMQ(Range Minimum/Maximum Query)
2.0 定义
欧拉序列:上面这棵树所对应的欧拉序列为:1, 5, 1, 4, 3, 4, 2, 4, 1
dfs 序:1 5 4 3 2。后文用 代替 dfs 序中的第 项。
dfn:
: 节点 在欧拉序列中第一次出现的位置。如,。
: 的 LCA 的节点编号。
2.1 dfs 序
-
一个事实:遍历以 为根的子树: — 的子树1 — 的子树2... || 在 dfs 序中, 的后代一定在 之后。
-
算法分析
问题:对于 , 求 。 特判。
不妨设 ,即先遍历到 。
① 当 不为祖孙关系时,即
中/深度最小的节点/的父亲是 。(※)
② 若 是 的祖先,我们想要沿用 ① 的方法(※),希望它能推广到这种情况。
中/深度最小的节点/的父亲是 。
事实上,我们发现这个对于 ① 的情况也适用。(※)
综上,对于 , 中/深度最小的节点/的父亲是 。
2.2 欧拉序
- 算法过程:
对于给定的有根树 , 求出其欧拉序列 。
现在想要求节点 的 LCA。
不妨设 。
有结论: 设 的深度是 中深度最小的节点,节点 的 LCA 就是 。
- 正确性说明:
首先, 中有 。
其次, 中深度最小的节点有且仅有一个。
最后, 是 中深度最小的节点。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理