题干
如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数。写一个程序求一棵二叉树中相距最远的两个节点之间的距离。(P241)
我的解答
没看答案前我的想法就是收集所有的叶子节点,然后将计算每对叶子节点的距离,找出距离最大的。显然距离最大的两个节点必然在叶子节点,或者一个根节点、一个是叶子节点。为什么说显然,我想是从图中观察分析的出的吧。
然而我的做法十分复杂,复杂到我都不想去写代码,所以请看书中的解答。
书中的解答
书中解答主要分析出了该问题可以利用分治的方式来解决,这非常关键。我虽然隐约有这样的感觉,但是还是无法很完整的用语言表述和清晰的思路。所以这是迫使我写这篇博客的原因。
根据自己的理解和书上的提示,可以归纳出:
- 如果最远距离的两个叶节点,分别在根节点的两个孩子上。那么我们分别在左右孩子上找到里根节点最远的叶子节点。
- 如果最远的距离的两个叶节点,在根节点一个孩子上。那么我们只需要把其孩子当作跟节点处理即可,问题又回到了1中所述。
当然,我们事先肯定不知道最远的两个叶子到底是在分别在根节点的左右孩子上,还是在一个孩子上。不过没关系,我们可以算对于每一个枝节点而言,最远的两个孩子各是多少,然后加起来就是该枝节点最大距离,当我们遍历所有枝节点,求出所有枝节点的最大距离,取其中最大的即可。
这说明我们的时间复杂度就是遍历整个节点,(因为必须到了一个节点才知道它是根节点还是叶节点)。此外,利用递归的方式,我们会每到一个枝节点就递归调用求最大距离的函数