leetcode -- Clone Graph -- deep copy问题,dfs,bfs

https://leetcode.com/problems/clone-graph/

思路可以有dfs,bfs。参考:
http://blog.csdn.net/shiquxinkong/article/details/37889721

这里的意思就是要我们写一个deep copy的函数。这里要注意亮点

  • 对于输入的graph, e.g. {0,1,2#1,2#2,2}, 这里可以看到1和2都不止出现了一次,所以不能在每次出现的时候都创建一个新的node。所以这里要用nodeMap做一个记录。
  • 这里每个node的neighbors其实是表示一条边,不会表示重复的边。所以这里node 1 只有node 2这个neighbor.

思路示意图,对于org graph, 对于每个node,我们都要copy一个。然后把edge也加上
leetcode -- Clone Graph -- deep copy问题,dfs,bfs_第1张图片

DFS

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):#注意理解这个函数的意思,就是clone一个node
        if None == node:
            return None
        #访问当前点,这里不是简单的print,而是复制,若已经复制,即这个node已经被创建,则返回副本
        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

这里要注意cloneNode函数输入一个node,准确的说是一个graph,因为这个node,还记录了其neighbors node. neighbors 还有neighbors。所以graph中任意一个node,其实就相当于linkedlist的head。其实返回的也是一个graph,copy的graph。这样就可以理解下面这句code了

也可以这样理解,这里self.cloneNode函数就是clone一个Node,对于node.neighbors内每个neighbor,都要进行clone,然后添加到其neighbors来。

clone.neighbors.append(self.cloneNode(neighbor, nodeMap))

BFS

参考http://www.cnblogs.com/zuoyuan/p/3753507.html

你可能感兴趣的:(LeetCode)