树上倍增法求最近公共祖先 LCA

本文介绍了使用树上倍增法求解二叉树中最近公共祖先(LCA)的问题,通过预处理节点深度和祖先信息,利用二分思想进行高效查询。并列举了多个相关题目,展示该算法的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

倍增其实就是二分的逆向,二分是逐渐缩小范围,而倍增是成倍扩大。
用于解决一些静态树的查询问题。

【模板】最近公共祖先

如何计算树上任意两点 x 和 y 的最近公共祖先 lca 呢?

设节点 i 的深度为 depth[i]。这可以通过一次 DFS 预处理出来。

假设 depth[x] ≤ depth[y](否则交换两点)。可以先把更靠下的 y 更新为 y 的第 depth[y] − depth[x] 个祖先节点,这样 x 和 y 就处在同一深度了。

如果此时 x = y,那么 x 就是 lca。否则说明 lca 在更上面,那么就把 x 和 y 一起往上跳。

由于不知道 lca 的具体位置,只能不断尝试,先尝试大步跳,再尝试小步跳。设 i = ⌊ l o g ⁡ 2 n ⌋ i= ⌊log⁡_2n⌋ i=

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值