可以使用DFS和BFS。参考https://blog.csdn.net/qq508618087/article/details/50806972
1.DFS 判断当前节点是否被创建,如果创建直接返回。使用unordered_map来存储已经建立的节点。递归访问每个节点和每个邻居
class Solution {
public:
UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
if (!node) return NULL;
if (hash.count(node)) return hash[node];//当前unorder_map中已经存在直接反回
hash[node] = new UndirectedGraphNode(node->label);
for (auto val : node->neighbors)
hash[node]->neighbors.push_back(cloneGraph(val));
return hash[node];
}
private:
unordered_map<UndirectedGraphNode *, UndirectedGraphNode *>hash;
};
2.BFS 使用队列来存储已经构建好的节点。首先将起始节点放入队列,然后进行广度遍历,遍历的对象为当前节点的邻居节点,如果还没被创建,则创建并放入队列。最后将会遍历所有节点完成克隆。
class Solution {
public:
UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
if (!node) return NULL;
UndirectedGraphNode* graph = new UndirectedGraphNode(node->label);
hash[node] = graph;
queue<UndirectedGraphNode*> q;
q.push(node);
while (!q.empty()) {
auto curNode = q.front();
q.pop();
for (auto val : curNode->neighbors) {
if (hash.find(val) == hash.end()) {
hash[val] = new UndirectedGraphNode(val->label);
q.push(val);
}
hash[curNode]->neighbors.push_back(hash[val]);
}
}
return graph;
}
private:
unordered_map<UndirectedGraphNode *, UndirectedGraphNode *>hash;
};