📅  最后修改于: 2023-12-03 14:54:35.577000             🧑  作者: Mango
给定一个 N 叉树,找到该树的中心节点。
中心节点定义: 其所有子树中的最大深度最小。
在上述示例中,节点 1 是该树的中心节点。
题目可以转换为寻找树的直径。
假设我们有一棵树,以节点 u
作为根节点,其深度最大的子节点是 v
,深度最大的子节点数目为 d
,则该树的直径从 u
到 v
,长度为 2d
。
因此,我们可以分别从每个节点开始遍历,找到其与其他节点之间的最短距离,最后找到距离最小的节点即可。
具体实现:
从任意一节点出发,使用 BFS 找到离该节点最远的节点 u
。
以 u
作为起点,使用 BFS 找到离 u
最远的节点 v
。
根据节点 v
到节点 u
的路径中的所有节点,找到其中深度最小的节点即为中心节点。
时间复杂度:O(n)。树中每个节点都会被遍历一次。
空间复杂度:O(n)。队列空间使用最大为 n。
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
为根节点的子树中的深度最小的节点。