定义什么是最近公共祖先?
在一棵树中(也就是有向无环图中),从根结点遍历到每个结点,路径上所经过的所有结点都叫做该结点的祖先结点
两个结点的祖先结点中重复的部分叫做公共祖先
公共祖先中层数最大的一个点叫做最近公共祖先(LCA)
求法向上标记法要求的两个结点依次向上遍历,找到的第一个公共祖先就是最近公共祖先
但是这个做法比较暴力,时间复杂度O(n)
倍增法首先需要预处理f[i][j]:从结点 i 向上走 2^j^ 步走到的结点,j 的范围是0 <= j <= logn比如说,当 j = 0 时,f[i][j]表示的就是 i 向上走一步到达的结点,其实也就是 i 的父结点
(如果从 i 开始跳 2^j^ 跳出了根结点,那么规定f[i][j] = 0且dist[0] = 0)
怎么实现这个算法呢?
我们发现,从结点 i 向上走 2^j^ 步,相当于结点 i 先向上走 2 ^j-1^ 步,再向上走 2 ^j-1^ 步据此,我们可以利用递归来解决这个问题
用式子可以表示为:f[i][j] = f[f[i][j - 1]][j - 1]
然后,我们需要预处理另一个数组depth[i]: ...