Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Graph 是否需要BFS、DFS搜索将树标记为已访问?_Graph_Tree_Depth First Search_Breadth First Search - Fatal编程技术网

Graph 是否需要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算法,它们似乎将节点标记为已访问。如果我只在树中导航,我的实现是否仍然需要将节点标记为已访问?我想对每个节点执行一次操作

它似乎只适用于存在循环的图形,这样我就有可能两次碰到同一个节点。如果我递归地对一棵树进行调用,那么似乎不需要具有已访问状态,因为在堆栈中的所有调用返回到当前节点之后,我可以选择在节点上执行我想要的操作。我的假设正确吗


谢谢

您的假设是正确的,标记仅适用于具有周期的数据结构,因为树没有周期-您可以从实现中删除标记部分,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)