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

时间:2016-01-25 14:51:40

标签: algorithm decomposition lowest-common-ancestor

给定一棵树,我需要找到从'a'到'b'的路径中的'k'节点。这意味着我需要在从节点'a'到节点'b'的路径中的'第k'位置找到节点。我正在考虑最低共同祖先和/或重光分解的线条,但我不确定这是否是这样做的方式。任何正确方向的指导都值得赞赏。

详细说明:

  • 树不是二叉树。它是一个无向图,有n-1个边,n个顶点,没有周期。只是你的常规树
  • 树的顶点编号为1到n。有n-1个无向边连接n-1对这些顶点
  • 'a'和'b'是树中从1到n编号的任意2个顶点。我们要找到从'a'到'b'的路径中的'k'节点。保证'k'的值是< =从'a'到'b'的路径中的节点数

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

1 个答案:

答案 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)。