Skip to main content

133.克隆图

标签: depth-first-search, breadth-first-search, graph, hash-table

难度: Medium

通过率: 60.27%

原题链接: https://leetcode.com/problems/clone-graph/description/

题目描述

给定一个无向连通图的一个节点引用,返回对该图的深度拷贝(克隆)。除了节点值(int)外,每个节点还包含一个邻居列表(List[Node])。要返回克隆节点的引用,作为克隆图的起始点。

解题思路

要实现图的深度拷贝,我们可以使用深度优先搜索(DFS)或者广度优先搜索(BFS)来遍历图,同时构建一个映射,以复制每个节点及其邻居。基本思路如下:

  1. 使用一个散列表(也称为映射)来记录已经克隆过的节点(这样就避免重复克隆,以及形成环路)。

  2. 对于给定的起始节点,如果此前未被克隆过,则创建一个新节点,并把它记录在散列表中。

  3. 递归(或迭代)地克隆每个节点的邻居,并将克隆的邻居添加到当前克隆节点的邻居列表中。

  4. 最终返回克隆的起始节点。

这种方案中,我们使用的映射的键是原始节点,值是克隆过的节点。

代码实现

class Node:
def __init__(self, val=0, neighbors=None):
self.val = val
self.neighbors = neighbors if neighbors is not None else []

class Solution:
def cloneGraph(self, node: 'Node') -> 'Node':
if not node:
return None

# 创建一个哈希表保存已克隆的节点
cloned = {}

# 使用DFS克隆图
def dfs(node):
# 如果节点已克隆过,直接返回其克隆
if node in cloned:
return cloned[node]

# 克隆当前节点
clone = Node(node.val)
cloned[node] = clone

# 克隆邻居
for neighbor in node.neighbors:
clone.neighbors.append(dfs(neighbor))
return clone

return dfs(node)

复杂度分析

时间复杂度:O(V+E)O(V + E),其中 VV 是节点数,EE 是边数。每个节点和每条边都只会遍历一次。 空间复杂度:O(V)O(V),用于存储已克隆的节点。