📜  找到位于 N 叉树中心的节点(1)

📅  最后修改于: 2023-12-03 14:54:35.577000             🧑  作者: Mango

找到位于 N 叉树中心的节点

问题描述

给定一个 N 叉树,找到该树的中心节点。

中心节点定义: 其所有子树中的最大深度最小。

示例

n_ary_tree_example

在上述示例中,节点 1 是该树的中心节点。

解题思路

题目可以转换为寻找树的直径。

假设我们有一棵树,以节点 u 作为根节点,其深度最大的子节点是 v,深度最大的子节点数目为 d,则该树的直径从 uv,长度为 2d

因此,我们可以分别从每个节点开始遍历,找到其与其他节点之间的最短距离,最后找到距离最小的节点即可。

具体实现:

  1. 从任意一节点出发,使用 BFS 找到离该节点最远的节点 u

  2. u 作为起点,使用 BFS 找到离 u 最远的节点 v

  3. 根据节点 v 到节点 u 的路径中的所有节点,找到其中深度最小的节点即为中心节点。

复杂度分析
  • 时间复杂度:O(n)。树中每个节点都会被遍历一次。

  • 空间复杂度:O(n)。队列空间使用最大为 n。

代码实现(Python)
class Solution:
    def findCenter(self, edges: List[List[int]]) -> int:
        n = len(edges) + 1
        graph = [[] for _ in range(n)]

        for u, v in edges:
            graph[u-1].append(v-1)
            graph[v-1].append(u-1)

        q = [0]
        visited = [False] * n
        visited[0] = True
        last = None
        while q:
            last = q[0]
            for _ in range(len(q)):
                node = q.pop(0)
                for nei in graph[node]:
                    if not visited[nei]:
                        q.append(nei)
                        visited[nei] = True

        q = [last]
        visited = [False] * n
        visited[last] = True
        while q:
            last = q[0]
            for _ in range(len(q)):
                node = q.pop(0)
                for nei in graph[node]:
                    if not visited[nei]:
                        q.append(nei)
                        visited[nei] = True

        return last + 1

其中,edges 为 N 叉树的边列表,n 为节点数,graph 为邻接表。

第一个 BFS 找到树的最长路径的结尾节点 last,第二个 BFS 找到以 last 为根节点的子树中的深度最小的节点。