原題地址:https://oj.leetcode.com/problems/clone-graph/node
題意:實現對一個圖的深拷貝。數組
解題思路:因爲遍歷一個圖有兩種方式:bfs和dfs。因此深拷貝一個圖也能夠採用這兩種方法。無論使用dfs仍是bfs都須要一個哈希表map來存儲原圖中的節點和新圖中的節點的一一映射。map的做用在於替代bfs和dfs中的visit數組,一旦map中出現了映射關係,就說明已經複製完成,也就是已經訪問過了。app
dfs代碼:spa
# Definition for a undirected graph node # class UndirectedGraphNode: # def __init__(self, x): # self.label = x # self.neighbors = [] class Solution: # @param node, a undirected graph node # @return a undirected graph node # @BFS def cloneGraph(self, node): def dfs(input, map): if input in map: return map[input] output = UndirectedGraphNode(input.label) map[input] = output for neighbor in input.neighbors: output.neighbors.append(dfs(neighbor, map)) return output if node == None: return None return dfs(node, {})
bfs代碼:code
# Definition for a undirected graph node # class UndirectedGraphNode: # def __init__(self, x): # self.label = x # self.neighbors = [] class Solution: # @param node, a undirected graph node # @return a undirected graph node # @BFS def cloneGraph(self, node): if node == None: return None queue = []; map = {} newhead = UndirectedGraphNode(node.label) queue.append(node) map[node] = newhead while queue: curr = queue.pop() for neighbor in curr.neighbors: if neighbor not in map: copy = UndirectedGraphNode(neighbor.label) map[curr].neighbors.append(copy) map[neighbor] = copy queue.append(neighbor) else: # turn directed graph to undirected graph map[curr].neighbors.append(map[neighbor]) return newhead