给定一棵树,在 Log(n) 中找到从节点 'a' 到节点 'b' 的路径中的第 k 个节点?

Given a tree, find the kth node in the path from node 'a' to node 'b' in Log(n)?

给定一棵树,我需要找到从 'a' 到 'b' 路径中的第 'k' 个节点。这意味着我需要在从节点'a'到节点'b'的路径中找到'kth'位置的节点。我在考虑 Lowest-common-ancestor and/or heavy-light decomposition 的路线,但我不确定这是否是这样做的方法。感谢任何正确方向的指导。

详情:

应用于每个查询(从 'a' 到 'b' 的第 k 个节点)的 BFS 不是一个选项,因为查询的数量很大。

执行 lowest-common-ancestor,并为每个节点保留其深度(到根的距离)。

接下来判断第k个节点是在a到lca还是lca到b部分。深度的差异是它们之间的节点数,因此如果 depth[a] - depth[lca] > k 则节点在 lca-b 部分。

如果节点在a到lca部分,只需要找到a的第k个祖先。使用您预先计算的 LCA 数据应该是 log(N)。

如果节点在 b 到 lca 部分,那么你可以计算 k',它是第 k 个节点到 b 的距离 (k' = 1 + depth[a] + depth[b] - 2*depth[lca] - k)),然后得到 b 的 k' 祖先(再次简单与 LCA 数据)。

总的来说,所有查找都是 logN,其他步骤是不变的,因此每个查询执行 O(LogN)。