查看BFS和DFS算法,他们似乎将节点标记为已访问。如果我正在浏览树只是我的实现仍然需要将节点标记为已访问或未访问?我想在每个节点上执行一次操作。
似乎只需要存在周期的图形,这样我就有可能碰到两次相同的节点。如果我以递归方式为树执行调用,则似乎没有必要具有访问状态,因为在从堆栈的所有调用返回到当前节点之后,我可以选择在节点上执行我想要的操作。我的假设是否正确?
感谢。
答案 0 :(得分:0)
您的假设是正确的,只有具有周期的数据结构才需要标记,因为树没有周期 - 您可以从实现中删除标记部分,BFS / DFS仍然可以工作!
示例:树的按顺序遍历实际上正在运行带有附加"规则的DFS"你总是先去看左边的孩子。
的Python:
def in-order(node):
if not node:
return
in-order(node.get_left())
print(node)
in-order(node.get_right())
答案 1 :(得分:0)
你对假定树的假设是正确的。
对于无向树 - 如果您选择不标记所有被访问的节点 - 您应该在递归中发送一个附加变量,该变量将告知当前节点的哪个邻居已经遍历(他的父节点在DFS遍历中)。
例如Python中的DFS(无向树):
def dfs(curr_node, parent):
for node in getNeighbors(curr_node):
if node!=parent:
dfs(node)
但是,BFS是迭代完成的,你无法避免在无向情况下进行标记。
答案 2 :(得分:0)
这是一种简单的递归方式来执行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)