Graph 是否需要BFS、DFS搜索将树标记为已访问?
查看BFS和DFS算法,它们似乎将节点标记为已访问。如果我只在树中导航,我的实现是否仍然需要将节点标记为已访问?我想对每个节点执行一次操作 它似乎只适用于存在循环的图形,这样我就有可能两次碰到同一个节点。如果我递归地对一棵树进行调用,那么似乎不需要具有已访问状态,因为在堆栈中的所有调用返回到当前节点之后,我可以选择在节点上执行我想要的操作。我的假设正确吗Graph 是否需要BFS、DFS搜索将树标记为已访问?,graph,tree,depth-first-search,breadth-first-search,Graph,Tree,Depth First Search,Breadth First Search,查看BFS和DFS算法,它们似乎将节点标记为已访问。如果我只在树中导航,我的实现是否仍然需要将节点标记为已访问?我想对每个节点执行一次操作 它似乎只适用于存在循环的图形,这样我就有可能两次碰到同一个节点。如果我递归地对一棵树进行调用,那么似乎不需要具有已访问状态,因为在堆栈中的所有调用返回到当前节点之后,我可以选择在节点上执行我想要的操作。我的假设正确吗 谢谢 您的假设是正确的,标记仅适用于具有周期的数据结构,因为树没有周期-您可以从实现中删除标记部分,BFS/DFS应该仍然有效 示例:按顺序遍
谢谢 您的假设是正确的,标记仅适用于具有周期的数据结构,因为树没有周期-您可以从实现中删除标记部分,BFS/DFS应该仍然有效 示例:按顺序遍历树实际上是在运行DFS,并附加一条“规则”,即始终先访问左边的子级 Python:
def in-order(node):
if not node:
return
in-order(node.get_left())
print(node)
in-order(node.get_right())
对于定向树,您的假设是正确的 对于无向树-如果选择不标记所有访问的节点-则应在递归中发送一个附加变量,该变量将告诉当前节点的哪个邻居已被遍历(DFS遍历中的父节点) 例如Python中的DFS(无向树):
但是,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)
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)