确定树中两个随机节点之间的距离

时间:2013-06-14 23:21:25

标签: algorithm data-structures graph tree

给定一般树,我想要两个节点vw之间的距离。

维基百科states the following

  

最低共同祖先的计算可能是有用的,例如,作为确定树中节点对之间距离的过程的一部分:从v到w的距离可以计算为从根到v的距离,加上从根到w的距离减去从根到其最低共同祖先的距离的两倍。

假设d(x)表示节点x距我们设置为1的根的距离。 d(x,y)表示两个顶点xy之间的距离。 lca(x,y)表示顶点对xy的最低共同祖先。

因此,如果我们有48lca(4,8) = 2,则根据上述说明d(4,8) = d(4) + d(8) - 2 * d(lca(4,8)) = 2 + 3 - 2 * 1 = 3。太棒了,真有效!

然而,上述情况似乎对顶点对(8,3)lca(8,3) = 2d(8,3) = d(8) + d(3) - 2 * d(2) = 3 + 1 - 2 * 1 = 2.失败了。但这是不正确的,距离d(8,3) = 4可见图表。对于跨越定义的根的任何事情,该算法似乎都失败了。

我错过了什么?

enter image description here

2 个答案:

答案 0 :(得分:5)

您错过了lca(8,3) = 1,而不是= 2。因此d(1) == 0使它成为:

d(8,3) = d(8) + d(3) - 2 * d(1) = 3 + 1 - 2 * 0 = 4

答案 1 :(得分:2)

对于适当的2节点,即右边的一个节点,d(lca(8,2)) == 0,而不是1,因为你在推导中有它。从根(在这种情况下是lca)到自身的距离为零。所以

d(8,2) = d(8) + d(2) - 2 * d(lca(8,2)) = 3 + 1 - 2 * 0 = 4

您有两个标记为2的节点这一事实可能令人困惑。

编辑:已对帖子进行了编辑,以便最初标记为2的节点现在标记为3.在这种情况下,派生现在是正确的但声明

 the distance d(8,2) = 4 as can be seen on the graph

不正确,d(8,2)= 2。