【发布时间】:2017-05-23 08:33:41
【问题描述】:
我正在尝试实施 DFS,但在这方面遇到了一些麻烦。
首先,我设法得到一个简单的 DFS 示例,它只在访问节点时打印出节点。
def DFS_helper(self, node, visited):
if node == None:
return
print(node.val)
visited.append(node)
for child in self.getChildren(node):
if child not in visited:
self.DFS_helper(child, visited)
def DFS(self, node):
visited = []
return self.DFS_helper(node, visited)
请注意,在上面的代码示例中,我使用 self.DFS_helper... 而不是 return 语句。为什么是这样?
现在,我正在尝试确定图中的两个节点是否可达。这是我的尝试。
def _isReachable(self, nodeA, nodeB, visited, stack):
if len(stack) == 0:
return False
if nodeA == nodeB:
return True
front = stack.pop(0)
visited.add(front) # mark the node as visited
for neighbor in nodeA.neighbors:
if neighbor not in visited: # if it's not already been visited
stack.append(neighbor)
return self._isReachable(neighbor, nodeB, visited, stack)
# given a directed graph, returns true if there is a route from nodeA to nodeB
# Returns false otherwise
# this method essentially runs a DFS from nodeA to nodeB
def isReachable(self, nodeA, nodeB):
if nodeA == None or nodeB == None:
return False
if nodeA == nodeB:
return True
stack = [nodeA]
visited = set()
return self._isReachable(nodeA, nodeB, visited, stack)
它不仅不起作用,而且我不太确定我是否理解调用递归函数和返回它的结果之间的区别。我已经尝试了两种方法都没有成功。对我的代码和概念上的任何帮助将不胜感激!
【问题讨论】:
-
我相信
DFS_helper(self, node, visited), DFS(self, node), _isReachable(self, nodeA, nodeB, visited, stack), isReachable(self, nodeA, nodeB)是类方法。如果不是,那么使用self.fun()语法调用它们是没有意义的。return self.DFS_helper(node, visited)完全没问题。递归发生在DFS_HELPER -
你能给我们提供样本输出和输入吗?什么是节点A?一类?列表?列表的姐妹?字典中的元素?没有足够的信息。
标签: python algorithm graph depth-first-search