133. Clone Graph(克隆图)
题目大意
Given a reference of a node in a connected undirected graph.
Return a deep copy (clone) of the graph.
Each node in the graph contains a value (int) and a list (List[Node]) of its neighbors.
中文释义
给定一个在连接的无向图中的节点的引用。
返回这个图的深度拷贝(克隆)。
图中的每个节点包含一个值(int)和一个邻居节点列表(List[Node])。
示例
- 示例 1:
- 输入:
adjList = [[2,4],[1,3],[2,4],[1,3]]
- 输出:
[[2,4],[1,3],[2,4],[1,3]]
- 解释:图中有 4 个节点。
第 1 个节点(val = 1)的邻居是第 2 个节点(val = 2)和第 4 个节点(val = 4)。
第 2 个节点(val = 2)的邻居是第 1 个节点(val = 1)和第 3 个节点(val = 3)。
第 3 个节点(val = 3)的邻居是第 2 个节点(val = 2)和第 4 个节点(val = 4)。
第 4 个节点(val = 4)的邻居是第 1 个节点(val = 1)和第 3 个节点(val = 3)。
- 输入:
- 示例 2:
- 输入:
adjList = [[]]
- 输出:
[[]]
- 解释:注意输入包含一个空列表。图只包含一个节点 val = 1,它没有任何邻居。
- 输入:
- 示例 3:
- 输入:
adjList = []
- 输出:
[]
- 解释:这是一个空图,它没有任何节点。
- 输入:
限制条件
- 图中的节点数在 [0, 100] 范围内。
1 <= Node.val <= 100
- 每个节点的
Node.val
是唯一的。 - 图中没有重复的边和没有自环。
- 图是连通的,所有节点都可以从给定的节点开始访问。
解题思路
使用深度优先搜索(DFS)和哈希表来解决问题。创建一个哈希表来存储原图中的节点到克隆图中的节点的映射。
步骤说明
- 创建一个哈希表
cloneMap
来存储原图节点到克隆图节点的映射。 - 遍历原图的每个节点:
- 如果节点已在
cloneMap
中,则返回对应的克隆节点。 - 否则,创建一个新的克隆节点并添加到
cloneMap
。 - 遍历原节点的邻居,并递归调用克隆函数。
- 如果节点已在
- 返回克隆的图的引用。
代码
class Solution {
public:
unordered_map<Node*, Node*> cloneMap;
Node* cloneGraph(Node* node) {
if (!node) return nullptr;
if (cloneMap.find(node) != cloneMap.end()) {
return cloneMap[node];
}
Node* new_node = new Node(node -> val);
cloneMap[node] = new_node;
for (auto& neighbor: node -> neighbors) {
new_node -> neighbors.push_back(cloneGraph(neighbor));
}
return new_node;
}
};