GraphNode *cloneGraphRe(GraphNode *node, MAP &exist) { if (!node) return NULL; if (exist.find(node) != exist.end()) return exist[node]; GraphNode *newNode = new GraphNode(node->data); exist[node] = newNode; for (int i = 0; i < node->neighbors.size(); ++i) newNode->neighbors.push_back(cloneGraphRe(node->neighbors[i], exist)); return newNode; }
UndirectedGraphNode *cloneGraphRe(UndirectedGraphNode *node, map<UndirectedGraphNode*, UndirectedGraphNode*> &visited) { if (node == NULL) return NULL; if (visited.find(node) != visited.end()) { return visited[node]; } UndirectedGraphNode *newnode = new UndirectedGraphNode(node->label); visited[node] = newnode; for (auto iter = node->neighbors.begin(); iter != node->neighbors.end(); iter++) { UndirectedGraphNode * sub = cloneGraphRe(*iter, visited); newnode->neighbors.push_back(sub); } return newnode; }
GraphNode *cloneGraph(GraphNode *node) { MAP exist; return cloneGraphRe(node, exist); }
UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) { map<UndirectedGraphNode*, UndirectedGraphNode*> visited; return cloneGraphRe(node ,visited); }