首先我们要求的是树的直径,以及在直径上的各个点
根据树的遍历顺序,我们可以将树的分支分为父节点和子节点,而经过一个点的最长路径长度,必然为其最长的两条分支路径之和
对于子节点分支来说,经过dfs求解出最长路径以及次长路径即可,比较容易
而对于父节点分支,我们需要分两种情况(假设当前访问点为u,子节点为j)
我们要找的是u的子节点路径中尽可能长的一条x,那么j的最长父节点路径即为x+1
①j是u的最长子节点路径。由于要找的路径x不能与j自身重合,所以我们选择u的次长子节点路径
②j不是u的最长子节点路径。此时选择u的最长子节点路径即可
求解完成后,对于每个点,在所有的分支路径中,选择最长的两个之和即为通过这个点的直径啦