边工作边刷题:70天一遍leetcode: day 11-1

Clone Graph

dfs或者bfs都可以做,这题的要点是hashmap有两个作用:一是图遍历中的visited,另一个是存copy的结点来连接neighbors。hashmap即表示visited,同时存某个结点的copy(这里有copy了就是已经visited)。

  • bfs和dfs本身特性的区别
    • bfs: 进q和展开是分开的。因为是按层处理,只有下层全进q,才开始从头出q同时展开下一层
    • dfs: 这里递归下一层相当于进q,展开相当于出q,也就是说进q和展开是同时的。
  • 根据上面1,dfs/bfs对visited的定义不同(or加入hashmap和判断visited的时机)
    • bfs:如果当前结点的neighbors没有创建结点,要创建并加入hashmap中。这样才能保证连接。同时要加入q中。而visited就表示已经进q了。而出q的结点不做visited判断
    • dfs:同样是"进q"的时候,visited判断和加入hashmap同时发生在一层。展开的neighbors要进入下一层
# Definition for a undirected graph node
# class UndirectedGraphNode(object):
#     def __init__(self, x):
#         self.label = x
#         self.neighbors = []

class Solution(object):
    def cloneGraph(self, node):
        """
        :type node: UndirectedGraphNode
        :rtype: UndirectedGraphNode
        """
        def clone(node, umap):
            if node not in umap:
                umap[node]=UndirectedGraphNode(node.label)
                for n in node.neighbors:
                    umap[node].neighbors.append(clone(n, umap))
            return umap[node]
        
        umap = {}
        if not node: return None
        return clone(node, umap)
posted @ 2016-05-12 10:58  absolute100  阅读(102)  评论(0编辑  收藏  举报