Clone an undirected graph. Each node in the graph contains a label
and a list of its neighbors
.
这里使用深度优先搜索。这样可以递归实现,如果是宽度优先,就要额外使用queue容器。
关键点:
1 这里的clone需要深度拷贝,就是要使用new操作了
2 防止回路无限循环,就要使用hash表,这里使用unordered_map记录访问过的节点。因为这里的label应该是唯一的才对,所以可以直接使用label作为关键字就可以。
/**
* Definition for undirected graph.
* struct UndirectedGraphNode {
* int label;
* vector<UndirectedGraphNode *> neighbors;
* UndirectedGraphNode(int x) : label(x) {};
* };
*/
class Solution {
public:
UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
unordered_map<int,UndirectedGraphNode*> visit;
return dsf(node,visit);
}
UndirectedGraphNode* dsf(UndirectedGraphNode* node,unordered_map<int,UndirectedGraphNode*>& visit) {
if(node == nullptr)
return nullptr;
if(visit.find(node->label)!= visit.end())
return visit[node->label];
UndirectedGraphNode* newNode = new UndirectedGraphNode(node->label);
newNode->neighbors.resize(node->neighbors.size());
visit.insert(make_pair(node->label,newNode));
for(int i=0;i<node->neighbors.size();i++) {
newNode->neighbors[i] = dsf(node->neighbors[i],visit);
}
return newNode;
}
};