本文介绍的是LCA在线算法中的倍增算法。
不知道LCA定义?请戳这儿
算法理论
- 朴素算法:记录下每个节点的父亲,使节点u,v一步一步地向上找父亲,直到找到相同的“祖先”,即是
所求的答案,时间复杂度O(n) - 优化算法(倍增法):利用二进制的思想,想办法使一步一步向上搜索变成以2^k的向上跳。所以
定义一个f[][]数组,使f[j][i]表示节点i的2^j倍祖先。
算法实现
1.预处理出所有节点的深度和父节点
* BFS防止爆栈 无法处理孩子个数
* DFS可能会爆栈 可以处理孩子个数 使用时建议扩栈
2.处理各节点的所有祖先节点
3.将所查询的两点上升到同一高度
* 找到祖先(以2^k的高度向上找)
* 未找到祖先,同时上升高度至找到公共祖先
附加代码
定义及初始化
|
|
算法函数
|
|