【发布时间】:2021-06-27 01:31:53
【问题描述】:
您好,我在理解 dfs 时遇到问题。我所知道的是 DFS 有两个版本;我们在通话前和通话后标记访问过。
def solution1(start):
def dfs1(cur):
for nei in cur.neighbors:
if nei not in visited:
## mark visit before call
visited.add(nei)
dfs1(nei)
## drive dfs1
visited = set()
visited.add(start)
dfs1(start)
def solution2(start):
def dfs2(cur):
## mark visit after call
visited.add(cur)
for nei in cur.neighbors:
if nei not in visited:
dfs2(nei)
## drive dfs2
dfs2(start)
但是,当我将版本 1(调用前已访问的标记)应用于问题 (https://leetcode.com/problems/clone-graph/) 时,它抱怨并且没有复制。
这是我的解决方案:
"""
# Definition for a Node.
class Node:
def __init__(self, val = 0, neighbors = None):
self.val = val
self.neighbors = neighbors if neighbors is not None else []
"""
class Solution:
"""
def dfs1(cur):
for nei in cur.neighbors:
if nei in visited: continue
visited.add(nei)
dfs1(nei)
visited.add(start_node)
dfs1(start_node)
"""
def dfs(self, cur, visited):
new_node = Node(cur.val)
# visited[cur.val] = new_node
new_neighbors = []
for nei in cur.neighbors:
if nei.val not in visited:
visited[nei.val] = nei
new_neighbors.append(self.dfs(nei, visited))
else:
new_neighbors.append(visited[nei.val])
new_node.neighbors = new_neighbors
return new_node
def cloneGraph(self, node: 'Node') -> 'Node':
if node == None:
return None
visited = {}
visited[node.val] = node
return self.dfs(node, visited)
让我知道为什么会出现问题。我不明白为什么它不起作用。
【问题讨论】:
-
我认为您的代码不起作用的主要原因是因为您将原始节点存储在
visited字典中。您必须在访问过的节点中存储已处理的 DFS 克隆。为什么?因为在new_neighbors.append(visited[nei.val])内部,您将访问节点添加到新克隆节点的邻居。但是任何克隆的节点都应该只有克隆的邻居,而不是原始节点。