给定无向图,是否可以找到最小高度的生成树?

时间:2017-11-19 14:40:58

标签: tree breadth-first-search minimum-spanning-tree graph-traversal topological-sort

这是我教授在课堂上提出的问题,我有点困惑。

我在考虑只是遍历图表以获得一棵树。然后,要确定最小高度,请将树的每个顶点作为根,然后比较高度。这是一种蛮力方法,我正在考虑一种更优雅的解决方案。

我发现这个网站http://buttercola.blogspot.com/2016/01/leetcode-minimum-height-trees.html解释了他们如何使用类似于BFS拓扑排序的方法获得最小高度树。

根据OP,我们取两个指针并将它们指向1度(叶子)的顶点,然后让它们以相同的速度移动。当两人见面时,我们找到了根。但这让我感到困惑,因为我们怎样才能确保我们选择了正确的叶子(如果有一个更长的路径呢?)

如果有人能帮我理解这一点,那将非常感激。

1 个答案:

答案 0 :(得分:1)

在两个两分球相遇后他没有停下来。他保留了其中一个,现在指向一个内部节点(可能是 root)。然后选择两个全新的叶子指针,但在继续之前,你需要了解“BFS拓扑排序”的工作原理。

尽管名字很难,但实际上非常简单。如果我们的答案树有高度h,我们会找到所有树叶并删除它们。这会将深度为h-1的每个内部节点转换为新叶。我们再次删除它们,这会在h-2生成新的叶子,依此类推,除非我们达到高度0,这给了我们的根。

因此,当这两个指针在一个节点中相遇时,它既可以是root,也可以是将来成为leaf的内部节点。在这种情况下,在将来的某个时刻,它将与上述程序的另一个相同高度的节点合作,并将我们引导到root,或者可能是另一个内部节点,然后.......

我的建议,完全忘记这两点。这样做是为了与“路径图”示例并行绘制,但在上述教程中只会增加其他简单概念的混淆。

但是在考虑它的时候,我偶然发现了另一种算法,我认为它比“BFS拓扑排序”更简单(至少在实现方面)。选择任何节点作为root用户,进行后期遍历以查找其所有子节点的高度。假设我们的根有3个高度为[2,3,8]的孩子。想想如果我们将“root-ship”转移到8会发生什么。所有过去的孩子都有高度< 8.新的那个,即我们当前的根有高度4(第二高= 3,加一)。因此,总体高度现在为8.(或者更低,我们可以通过递归重复我们对8的root所做的事情来发现。)