树中的算法

如何计算树的直径

O(2n)算法
随便找一个节点a开始bfs或dfs,找出以a为根节点的树中离a最远的节点b,那么b必然是直径上的一个端点,然后以b为根节点开始bfs/dfs,就很容易计算出直径了。
证明:为什么b为直径上的端点?
以a为根节点的树中,直径对应的路径可以经过a,也可以不经过a。
(1)经过a的话,很容易,b必然是端点
(2)不经过a,那肯定是a的某个子孙c,c选择了众多儿子路径中的最长的两条组成的,这个最长路径经过了c。此时最长路径由于肯定到达了叶子结点,那么必然会走a最远儿子那条路,因为如果不走,我们就可以构造更长的一条路。
构造方法也可以画图分类讨论,分为高度比c高和比c低两种。

你可能感兴趣的:(算法)