LeetCode 133. Clone Graph 题解
题目描述
给你无向连通图中一个节点的引用,请你返回该图的深拷贝(克隆)。
图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[Node])。
示例 1:
输入:adjList = [[2,4],[1,3],[2,4],[1,3]]
输出:[[2,4],[1,3],[2,4],[1,3]]
解释:
图中有 4 个节点。
节点 1 的值是 1,它有两个邻居:节点 2 和 4 。
节点 2 的值是 2,它有两个邻居:节点 1 和 3 。
节点 3 的值是 3,它有两个邻居:节点 2 和 4 。
节点 4 的值是 4,它有两个邻居:节点 1 和 3 。
解题思路
图的深拷贝需要:
- 创建所有节点的新副本
- 正确连接所有邻居关系
使用哈希表记录原节点到新节点的映射,避免重复创建。
代码实现
方法一:DFS
class Node:
def __init__(self, val = 0, neighbors = None):
self.val = val
self.neighbors = neighbors if neighbors is not None else []
def cloneGraph(node):
if not node:
return None
visited = {}
def dfs(node):
if node in visited:
return visited[node]
# 创建克隆节点
clone = Node(node.val)
visited[node] = clone
# 克隆邻居
for neighbor in node.neighbors:
clone.neighbors.append(dfs(neighbor))
return clone
return dfs(node)
方法二:BFS
from collections import deque
def cloneGraph(node):
if not node:
return None
visited = {node: Node(node.val)}
queue = deque([node])
while queue:
curr = queue.popleft()
for neighbor in curr.neighbors:
if neighbor not in visited:
visited[neighbor] = Node(neighbor.val)
queue.append(neighbor)
visited[curr].neighbors.append(visited[neighbor])
return visited[node]
复杂度分析
- 时间复杂度:O(V + E),需要访问所有节点和边
- 空间复杂度:O(V),哈希表的空间
总结
本题是图的基本操作,考察深拷贝的实现。
关键点:
- 使用哈希表记录映射关系
- DFS 或 BFS 遍历图
- 避免重复创建节点

305

被折叠的 条评论
为什么被折叠?



