【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 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值