📜  无向树中的最长路径(1)

📅  最后修改于: 2023-12-03 15:40:06.514000             🧑  作者: Mango

无向树中的最长路径

在无向树中,一条路径是指两个节点之间的一系列边的集合,这些边按照节点的相邻关系连接在一起。路径的长度是指路径上边的数量。在一棵树中,最长路径是指路径长度最长的那条路径。

算法实现

最常见的求解无向树中最长路径的算法,是通过DFS(深度优先遍历)来实现的。具体的步骤如下:

  1. 从任意一个节点开始进行DFS遍历,并记录下当前遍历到的节点。
  2. 依次遍历当前节点的所有相邻节点,并且只选择未被遍历过的节点进行遍历。
  3. 每次遍历过一个相邻节点,就对当前节点的路径长度加1,并且将当前节点标记为已经遍历过。
  4. 继续对所有相邻节点进行DFS遍历,并在遍历的过程中维护最长路径长度。
  5. 如果当前节点没有相邻节点未被遍历过,那么就将当前节点标记为已经遍历过,并回溯到上一级节点,继续遍历其它未被遍历过的相邻节点。

这个算法的时间复杂度是O(n),其中n为无向树中节点的数量。

代码实现

下面是基于DFS的求解无向树中最长路径的Python代码实现:

class TreeNode:
    def __init__(self, val):
        self.val = val
        self.children = []

def longestPath(root: TreeNode) -> int:

    def dfs(node: TreeNode, parent: TreeNode) -> int:
        nonlocal ans
        max1 = max2 = 0
        for child in node.children:
            if child != parent:
                depth = dfs(child, node)
                if depth > max1:
                    max1, max2 = depth, max1  # 注意更新最大、次大深度
                elif depth > max2:
                    max2 = depth
        ans = max(ans, max1 + max2)  # 因为是双向的,所以需要将max1和max2相加
        return max(max1, max2) + 1

    ans = 0
    dfs(root, None)
    return ans

需要注意的是,这个算法是通过DFS来实现的,因此需要定义一个深度优先遍历的函数dfs。同时,由于在DFS的过程中需要遍历节点的所有相邻节点,并且只选择未被遍历过的节点进行遍历,因此需要记录下已经遍历过的节点,并在遍历相邻节点时进行判断。此外,在维护最长路径的过程中需要将最大深度和次大深度都进行更新,如代码所示。

总结

综上所述,求解无向树中最长路径的算法是基于DFS实现的,时间复杂度为O(n),其中n为无向树中节点的数量。在实现的过程中需要注意节点的判断以及最大深度和次大深度的更新。