给定一棵树,我需要找到从'a'到'b'的路径中的'k'节点。这意味着我需要在从节点'a'到节点'b'的路径中的'第k'位置找到节点。我正在考虑最低共同祖先和/或重光分解的线条,但我不确定这是否是这样做的方式。任何正确方向的指导都值得赞赏。
详细说明:
应用于每个查询的BFS(从'a'到'b'的第k个节点)不是一个选项,因为查询的数量很大。
答案 0 :(得分:1)
做最低共同的祖先,并为每个节点保留它的深度(到根的距离)。
接下来判断第k个节点是否在a到lca或lca到b部分。深度差异是它们之间的节点数,因此如果depth[a] - depth[lca] > k
则节点位于lca-b部分上。
如果节点位于a到lca部分,只需找到a的第k个祖先。应使用您预先计算的LCA数据记录(N)。
如果节点位于b到lca部分,那么你可以计算k'这是第k个节点距离b(k' = 1 + depth[a] + depth[b] - 2*depth[lca] - k)
)的距离,然后得到k' b的祖先(再次使用LCA数据很容易)。
总体而言,所有查找都是logN,其他步骤是常量,因此每个查询都执行O(LogN)。