笔记
- 专门挑容易理解的算法
- 最直观的程序
LAC(最近公共祖先)
tarjan算法流程(模拟):
procedure dfs(i);
begin
设置i号节点的祖先为i
若i的左子树不为空,dfs(i-左子树);
若i的右子树不为空,dfs(i-右子树);
访问每一条与i相关的询问
若另一个节点已经被访问过,则输出另一个节点当前的祖先
标记i为已经访问,将所有i的孩子包括i本身的祖先改为i的父亲
end;
倍增:
1、预处理出每个节点的深度
2、读取一组询问,对于两个节点,先跳到同一深度
3、判断当前两节点所在的节点是否为同一节点,是则其为LCA,否则继续下一步
4、从大往小进行检查,……8步、4步、2步、1步……,若跳后节点不一致,则可以跳,若节点一致,则不跳
5、两节点所在的点的父亲节点即为LCA
转载自白话系列–LAC