查看BFS和DFS算法,它们似乎将节点标记为已访问。如果我只在树中导航,我的实现是否仍然需要将节点标记为已访问?我想对每个节点执行一次操作。
它似乎只适用于存在循环的图形,这样我就有可能两次碰到同一个节点。如果我递归地对一棵树进行调用,那么似乎不需要具有已访问状态,因为在堆栈中的所有调用返回到当前节点之后,我可以选择在节点上执行我想要的操作。我的假设正确吗?
谢谢
这是一种简单的递归方法来执行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)
您的假设是正确的,标记只在有周期的数据结构中才需要,因为树没有周期-您可以从实现中删除标记部分,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(无向树):
def dfs(curr_node, parent):
for node in getNeighbors(curr_node):
if node!=parent:
dfs(node)
然而,BFS是迭代完成的,在无向情况下,您不能避免标记。
我必须为一个算法开发伪代码,该算法计算给定顶点V和边E的图G=(V,E)中连通分量的数量。 我知道我可以使用深度优先搜索或广度优先搜索来计算连接组件的数量。 但是,我想用最高效的算法来解决这个问题,但是我不确定每个算法的复杂度。 下面是一个用伪代码形式写DFS的尝试。 下面尝试以伪代码形式编写 BFS。 我的讲师说BFS与DFS具有相同的复杂性。 然而,当我搜索深度优先搜索的复杂度时,它是O(V^
我正在编写一个。NET应用程序,它应该读取一个大约200页长的。docx文件(通常是documentformat.openxml2.5),以查找文档应该包含的某些标记的所有出现情况。明确地说,我不是在寻找OpenXML标记,而是应该由文档编写器设置到文档中的标记,作为在第二阶段需要填充的值的占位符。此类标记应采用以下格式: (其中TAG可以是任意字符序列)。正如我所说的,我必须找到这类标签的所有出
我遇到了一个使用Python解决Leetcode79字搜索的问题。 给定一个m×n的字符板网格和一个字符串字,如果该网格中存在字,则返回true。 该字可以由顺序相邻单元格的字母构成,其中相邻单元格水平或垂直相邻。同一个字母单元格不能使用不止一次。 我试图使用一个字符队列和一个BFS来查看是否有一个单词存在于黑板上,但解决方案似乎对某些单词有效,而不是其他单词。例如,在第一个testcase中,访
来自topcoder的一篇文章: “在BFS中,我们在将顶点推入队列时标记访问的顶点,而不是在DFS中弹出顶点时标记访问的顶点。” 注意:这是在使用显式堆栈(伪dfs)实现dfs时说的。 我的问题是为什么会这样?为什么我们不能在从队列弹出后标记访问的顶点,而在bfs的情况下推到队列上?
在“二叉树”中,一个外部节点是一个没有任何子节点的节点,无论是左的还是右的,如果我错了,请纠正我-在“二叉树”中,一个外部节点总是空的,因为根据我的课堂讲稿,一个内部节点总是有两个子节点,即使没有创建,但我们假设该内部节点的子节点是空的。那么,如果外部节点为空,我如何访问它呢? 我将这段代码作为BST节点类的一部分编写: Last方法给我nullPointerException
我正在研究BFS算法,我有一个关于如何将相邻节点插入队列的问题。 例如,假设我们正在处理一个无向图,我们希望执行BFS来输出图的内容,那么我们如何知道在从队列中取出一个初始节点后,相邻节点以什么顺序插入到队列中呢?还有,有没有办法修改邻居节点插入队列的方式? 任何帮助都将不胜感激,谢谢。