思路
- 克隆图——根据给定的一个结点,自己遍历一遍图,产生不同于引用的结点
- 广度搜先搜索遍历图,对于访问过的结点用哈希表进行存储
- 哈希表的key为原结点,value为克隆结点
代码
步骤:
1. 将第一个结点放入队列,并访问其将放入哈希表
2. 弹出队头,访问其邻结点,未访问过将其放入哈希表,放入队列
3. 更新当前结点的邻近表
4. 返回哈希表第一个结点的克隆结点
class Solution {
public:
Node* cloneGraph(Node* node) {
if (node == nullptr)
return node;
unordered_map<Node*, Node*> visited;
queue<Node*> Q; Q.push(node);
visited[node] = new Node(node->val);
while (!Q.empty()) {
auto n = Q.front();Q.pop();
for (auto& neighbor: n->neighbors) {
if (visited.find(neighbor) == visited.end()) {
visited[neighbor] = new Node(neighbor->val);
Q.push(neighbor);
}
visited[n]->neighbors.emplace_back(visited[neighbor]);
}
}
return visited[node];
}
};