【leetcode】Clone Graph(python)

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

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 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章