广搜算法
1.使用一个哈希表 visited 存储所有已被访问和克隆的节点。哈希表中的 key 是原始图中的节点,value 是克隆图中的对应节点。
2.将题目给定的节点添加到队列。克隆该节点并存储到哈希表中。
3.每次从队列首部取出一个节点,遍历该节点的所有邻接点。如果某个邻接点已被访问,则该邻接点一定在 visited 中,那么从 visited 获得该邻接点,否则创建一个新的节点存储在 visited 中,并将邻接点添加到队列。将克隆的邻接点添加到克隆图对应节点的邻接表中。重复上述操作直到队列为空,则整个图遍历结束。
/*
// Definition for a Node.
class Node {
public:
int val;
vector<Node*> neighbors;
Node() {
val = 0;
neighbors = vector<Node*>();
}
Node(int _val) {
val = _val;
neighbors = vector<Node*>();
}
Node(int _val, vector<Node*> _neighbors) {
val = _val;
neighbors = _neighbors;
}
};
*/
class Solution {
public:
Node* cloneGraph(Node* node) {
if (node==NULL) return NULL;
unordered_map<Node*, Node*> vis;
queue<Node*> q;
q.push(node);
Node* clonenode = new Node(node->val);
vis[node] = clonenode;
while (!q.empty())
{
Node* tmp = q.front();
q.pop();
Node* clonetmp = vis[tmp];
for (auto & neighbor:tmp->neighbors)
{
if (vis.find(neighbor)==vis.end())
{
vis[neighbor] = new Node(neighbor->val);
q.push(neighbor);
}
clone.tmp->neighbors.push_back(vis[neighbor])
}
}
return clonenode;
}
};