![](/img/trans.png)
[英]BFS, Iterative DFS, and Recursive DFS: When to Mark Node as Visited
[英]BFS, DFS searches required to mark as Visited for trees?
查看BFS和DFS算法,他们似乎将节点标记为已访问。 如果我正在浏览树只是我的实现仍然需要将节点标记为已访问或未访问? 我想在每个节点上执行一次操作。
似乎只需要存在周期的图形,这样就有可能两次撞到同一个节点。 如果我以递归方式为树执行调用,则似乎没有必要具有访问状态,因为在从堆栈的所有调用返回到当前节点之后,我可以选择在节点上执行我想要的操作。 我的假设是否正确?
谢谢。
您的假设是正确的,只有具有循环的数据结构才需要标记,因为树没有循环 - 您可以从实现中删除标记部分,BFS / DFS仍然可以工作!
示例:树的按顺序遍历实际上正在运行带有附加“规则”的DFS,您始终首先访问左侧子项。
蟒蛇:
def in-order(node):
if not node:
return
in-order(node.get_left())
print(node)
in-order(node.get_right())
您的假设对于定向树是正确的。
对于无向树 - 如果您选择不标记所有被访问的节点 - 您应该在递归中发送一个附加变量,该变量将告知当前节点的哪个邻居已经遍历(他的父节点在DFS遍历中)。
例如Python中的DFS(无向树):
def dfs(curr_node, parent):
for node in getNeighbors(curr_node):
if node!=parent:
dfs(node)
然而,BFS是迭代完成的,你无法避免在无向情况下进行标记。
这是一种简单的递归方式来执行DFS算法:
def dfs(node):
"""Depth First Search Algorithm"""
if not node or node.visited:
return
node.visited = True
dfs(node.below)
dfs(node.right)
dfs(node.above)
dfs(node.left)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.