原题地址: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