繁体   English   中英

给定一棵树,在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”位置找到该节点。 我在考虑最低共同祖先和/或强光分解的路线,但是我不确定这是否是这样做的方式。 朝着正确方向的任何指导表示赞赏。

细节:

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

由于查询数量很大,因此无法选择将BFS应用于每个查询(从“ a”到“ b”的第k个节点)。

做最普通的祖先,并为每个节点保留其深度(到根的距离)。

接下来找出第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)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM