寻找以哪个节点作为根节点的时候树的高度最小。
作为根节点的节点一定在树的直径的中点。如果不在中点,那么一定有一个节点的距离根节点超过树的半径的距离。(树上路径唯一,直径连接两个叶子节点,那么如果根节点不在直径上,有一个节点至少需要走完半径后再走向根节点)
寻找直径的方法,两次bfs和分治法,以为这题需要得到路径所以我用的是两次bfs,第一次从任意一个点o出发找到离它最远的点p,第二次再从q出发找离它最远的点q,p-q就是直径。
证明:如果p-q不是直径,那么假设直径为a-b
1)a-b与o-p相交于m,由于p是距离o最远的点,所以om+mp > om+ma,mp>ma,b-p>a-b,与a-b直径矛盾
2)a-b与o-p不相交,那么两条路径间通过m-n连通,om+mp > om+mn+nb,mp>mn+nb,an+mn+mp > an+mn+nb > ab 与a-b直径矛盾
分治法的话就是从叶子节点开始,计算节点距离叶子节点的距离,父节点的最大距离=max(子节点) + 1,树形dp。还需要缓存下第二大距离,最后最远距离+次远距离就是直径长。
C++ Code
1 | class Solution { |