繁体   English   中英

如何找到树的任意两个顶点之间的边或顶点数量?

[英]How to find the number of edges or vertices between any two vertices of a tree?

它是一棵普通树(无环图),因此只能有一个这样的路径。 我可以使用哪种算法?

编辑:

需要找到树中所有顶点对的路径

我想在这里扩展@templatetypedef的答案1

请注意,在您的问题中,您需要对树中的每对节点至少执行一次写入操作。 其中有n*(n-1)/2个。
因此,就O表示法而言,您找不到比O(n^2)更好的算法。

现在,使用DFSBFS查找每个节点的路径。 它将在O(n+m)n个顶点, m边)中运行。 但是由于它是一棵树,我们知道m=n-1 ,对于BFS / DFS给我们O(n) 请注意,在某个节点v的单个BFS / DFS中,每个节点u都得到d(v,u)

如果对每个节点重复此操作,它将得到O(n^2) -就大O表示法而言,这是最佳选择。 我同意您可能会通过一些优化获得更好的常量,但是仅此而已。


(1)以评论开头,但是它太长了,我认为它值得回答。

一个简单的选择是从一个节点开始进行深度优先搜索,直到到达另一个节点为止。 然后,您可以查看从第一个节点到第二个节点的路径,该路径必须是这些节点之间的唯一路径,然后计算该路径中有多少条边。 这以线性时间运行,因为树上的DFS仅占用线性时间。

希望这可以帮助!

您需要找到最低公共祖先 (LCA)。 您可以在此处研究不同的方法: http : //leetcode.com/2011/07/lowest-common-ancestor-of-a-binary-tree-part-i.html

由于我不喜欢递归,因此我使用了休闲解决方案,因为您需要以有效的方式查找所有对,所以该方法更适合您的问题。

在此处输入图片说明

1-)在A-> B之间寻找路径:-从节点A开始迭代,沿着每个父节点向上标记每个A标记,直到父根基金为止。 -从节点B开始迭代,直到找到A标志。 您已找到LCA节点。 -结果路径是从A到LCA节点的列表,以及从B到LCA节点的反向列表。

2-)改进发现A-> B:-同时迭代两个节点,分别用A标志和B标志标记每个祖先节点。 直到A迭代找到B标志或B迭代找到A标志。 然后第一个找到另一个节点标志的人找到了LCA节点。

3-)查找所有线对路径:您可以简单地对每个线对使用上述解决方案。 或者尝试考虑进行第一遍遍历所有树以创建标志列表的过程,然后进行第二遍遍以识别每对树的所有LCA节点,这在节点的树数太大时会很不方便。

暂无
暂无

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

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