【leetcode】Clone Graph(python),leetcodepython
類似於二叉樹的三種遍曆,我們可以基於遍曆的模板做很多額外的事情,圖的兩種遍曆,深度和廣度模板同樣也可以做很多額外的事情,這裡舉例利用深度優先遍曆的模板來進行複製,深度優先中,我們先訪問第一個結點,接著訪問第一個鄰接點,再訪問鄰節點的鄰節點。。。。
class Solution: # @param node, a undirected graph node # @return a undirected graph node def cloneGraph(self, node): if None == node: return None nodeMap = {} return self.cloneNode(node, nodeMap) def cloneNode(self, node, nodeMap): if None == node: return None #訪問當前點,這裡不是簡單的print,而是複製,若已經複製,則返回副本 if nodeMap.has_key(node): return nodeMap[node] #若沒有副本,則複製一份,同樣處理其鄰接點 else: clone = UndirectedGraphNode(node.label) nodeMap[node] = clone #訪問其鄰居節點 for neighbor in node.neighbors: clone.neighbors.append(self.cloneNode(neighbor, nodeMap)) return clone
與這個題類似,
Copy List with Random Pointer 這個題目中如果允許使用額外的空間,我們也可以用這種辦法來獲得一份拷貝。
class Solution: # @param head, a RandomListNode # @return a RandomListNode def copyRandomList(self, head): if None == head: return None nodeMap = {} return self.copyListNode(head, nodeMap) def copyListNode(self, node, nodeMap): if None == node: return None if nodeMap.has_key(node): return nodeMap[node] else: cpNode = RandomListNode(node.label) nodeMap[node] = cpNode cpNode.next = self.copyListNode(node.next, nodeMap) cpNode.random = self.copyListNode(node.random, nodeMap) return cpNode