Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors.
We can use BFS to search the graph can clone it at the same time. A map can be used to store those nodes that are already cloned.
C++ Code:
/* * func: clone_graph_helper * goal: helper function to perform BFS * @param node: current node to be cloned * @param visited: node already existed in the new graph * return: newly cloned node */ UndirectedGraphNode *clone_graph_helper(UndirectedGraphNode *node, unordered_map<int, UndirectedGraphNode*> &visited){ UndirectedGraphNode *new_node = new UndirectedGraphNode(node->label); visited[node->label] = new_node; for(int i = 0; i < node->neighbors.size(); ++i){ if(visited.find(node->neighbors[i]->label) != visited.end()){ new_node->neighbors.emplace_back(visited[node->neighbors[i]->label]); }else{ new_node->neighbors.emplace_back(clone_graph_helper(node->neighbors[i], visited[node->neighbors[i]->label])); } } return new_node; } /* * func: clone_graph * goal: clone a undirected graph * @param node: a start node * return: a cloned start node */ UndirectedGraphNode *clone_graph(UndirectedGraphNode *node){ if(node == nullptr){ return nullptr; } unordered_map<int, UndirectedGraphNode*> visited; UndirectedGraphNode* new_node = clone_graph_helper(node, visited); return new_node; }
Python Code:
# func: clone graph # @param node: start node # @return: new start node def clone_graph(node): if not node: return None visited = {} def clone_graph_helper(start): new_node = UndirectedGraphNode(start.label) visited[start.label] = new_node for neighbor in start.neighbors: if neighbor.label in visited: new_node.neighbors.append(visited[neighbor.label]) else: new_node.neighbors.append(clone_graph_helper(neighbor)) return new_node return clone_graph_helper(node)
No comments:
Post a Comment