BFS Iterative (queue)
def cloneGraph(self, node: 'Node') -> 'Node':
if not node: return node
queue = [node]
visited = {node: Node(node.val)}
while queue:
size = len(queue)
for i in range(size):
front = queue.pop(0)
for n in front.neighbors:
if n not in visited:
visited[n] = Node(n.val)
queue.append(n)
visited[front].neighbors.append(visited[n])
return visited.get(node)
DFS Iterative (stack)
def cloneGraph(self, node: 'Node') -> 'Node':
if not node: return node
stack = [node]
visited = {node: Node(node.val)}
while stack:
top = stack.pop()
for n in top.neighbors:
if n not in visited:
visited[n] = Node(n.val)
stack.append(n)
visited[top].neighbors.append(visited[n])
return visited.get(node)
DFS Recursion
def cloneGraph(self, node: 'Node') -> 'Node':
visited = {}
def clone(node):
if not node: return None
if node in visited: return visited[node]
copy = Node(node.val)
visited[node] = copy
for n in node.neighbors:
copy.neighbors.append(clone(n))
return copy
return clone(node)
C++
重点:避免重复copy
class Solution {
public:
UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
unordered_map<UndirectedGraphNode*, UndirectedGraphNode*> t;
return clone(node, t);
}
UndirectedGraphNode* clone(UndirectedGraphNode* node, unordered_map<UndirectedGraphNode*, UndirectedGraphNode*>& t){
if(!node) return node;
if(t.count(node)) return t[node];
UndirectedGraphNode* nnode = new UndirectedGraphNode(node->label);
t[node] = nnode;
vector<UndirectedGraphNode*> temp = node->neighbors;
for(int i=0;i<temp.size();i++){
(nnode->neighbors).push_back(clone(temp[i], t));
}
return nnode;
}
};