这是我教授在课堂上提出的问题,我有点困惑。
我在考虑只是遍历图表以获得一棵树。然后,要确定最小高度,请将树的每个顶点作为根,然后比较高度。这是一种蛮力方法,我正在考虑一种更优雅的解决方案。
我发现这个网站http://buttercola.blogspot.com/2016/01/leetcode-minimum-height-trees.html解释了他们如何使用类似于BFS拓扑排序的方法获得最小高度树。
根据OP,我们取两个指针并将它们指向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所做的事情来发现。)