類似於二叉樹的三種遍歷,我們可以基於遍歷的模板做很多額外的事情,圖的兩種遍歷,深度和廣度模板同樣也可以做很多額外的事情,這裏舉例利用深度優先遍歷的模板來進行復制,深度優先中,我們先訪問第一個結點,接着訪問第一個鄰接點,再訪問鄰節點的鄰節點。。。。
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