当前位置: 首页 > 知识库问答 >
问题:

为什么我们必须对解析树使用深度优先遍历?

荀学文
2023-03-14

在我学习解析技术的过程中,解析树似乎总是以深度优先的方式遍历。

最左边的派生对应于解析树的前序遍历,而最右边的派生对应于解析树的后序遍历的相反[1]

而预序和后序遍历只是深度优先树遍历的两种特定类型[2]

我认为原因在于普通树和解析树的区别。普通树只记录节点之间的拓扑结构,而解析树记录的不止这些。解析树还意味着父节点是在子节点上构建的,因为父节点派生到子节点的集合中。如果我们想计算解析树的根节点,这是创建解析树的最终目标,我们必须计算所有的先决条件。因此,深度优先遍历是自然必须的。

我的理解正确吗?或者是否存在其他需要/必须使用其他方式遍历解析树的场景?

共有1个答案

高夜洛
2023-03-14

您只考虑两种可能的解析策略:自顶向下的从左到右解析和自底向上的从左到右解析。当然,这是两种最流行的策略。但这并不是唯一的可能性。

正如您引用的文本所示,这两种策略中的每一种都对应于一个解析树遍历。这两个遍历实际上都是深度优先的,因为这两个解析策略都是从左到右的。[注1]

许多其他解析策略是可用的,它们将对应于其他树遍历。例如,您可以尝试从中间的某个地方开始解析文本(例如,在某个点上,由于某种原因,您对解析很确定,也许是因为您在所有可能的括号分组中),并以某种确定的方式从那里向外工作通过你的解析算法。这种策略当然是可能的,甚至有一定数量的关于它的文献(可能不是很最新),因为它在对不正确的文本进行部分解析的背景下是有意义的,例如用于诊断目的或语法高亮显示。

即使执行从左到右的解析,也不需要在自上而下和自下而上的解析之间进行选择。在LALR算法被发现之前,有相当多的关于“左角”(LC)解析的研究,它在方便的地方(“角落”)在自上而下和自下而上解析之间切换。这样产生的推导既不是最左边也不是最右边,并且很难描述相应的遍历(如我的脚注所示),尽管我认为合理的描述仍然会导致深度优先的对应,因为算法仍然是从左到右的。

在所有情况下,一旦构建了解析树(或抽象语法树),您就可以自由地以任何您喜欢的方式遍历它,并且不同的语义分析算法执行不同类型的遍历。在优化多程编译器中,您可能会发现各种各样不同的树遍历,一些是深度优先,一些是广度优先,还有一些是根据需要弹跳的。

>

另一方面,自底向上策略从最左边的叶节点开始,并继续推导到达该点的遍历,这就是为什么引用的文本称其为遍历的“反向”。这真的是一个有意义的概念吗?当然,作为对最终结果的描述,它是有意义的,但它实际上并不符合“遍历”一词的任何直观意义。如果你要去伦敦,你不能从M40的最后一个出口出发。

 类似资料:
  • 主要内容:src/runoob/binary/Traverse.java 文件代码:二分搜索树遍历分为两大类,深度优先遍历和层序遍历。 深度优先遍历分为三种:先序遍历(preorder tree walk)、中序遍历(inorder tree walk)、后序遍历(postorder tree walk),分别为: 1、前序遍历:先访问当前节点,再依次递归访问左右子树。 2、中序遍历:先递归访问左子树,再访问自身,再递归访问右子树。 3、后序遍历:先递归访问左右子树,再访问自身节

  • 本文向大家介绍面向对象深度优先和广度优先是什么?相关面试题,主要包含被问及面向对象深度优先和广度优先是什么?时的应答技巧和注意事项,需要的朋友参考一下  

  • 本文向大家介绍手写代码:二叉树深度优先遍历相关面试题,主要包含被问及手写代码:二叉树深度优先遍历时的应答技巧和注意事项,需要的朋友参考一下 参考回答: //深度优先搜索 //利用栈,现将右子树压栈再将左子树压栈

  • 主要内容:非连通图的生成森林,深度优先生成森林,广度优先生成森林前面已经给大家介绍了有关 生成树和生成森林的有关知识,本节来解决对于给定的无向图,如何构建它们相对应的生成树或者生成森林。 其实在对无向图进行遍历的时候,遍历过程中所经历过的图中的顶点和边的组合,就是图的生成树或者生成森林。 图 1 无向图   例如,图 1 中的无向图是由 V1~V7 的顶点和编号分别为 a~i 的边组成。当使用 深度优先搜索算法时,假设 V1 作为遍历的起始点,涉及到的顶点和边

  • 深度优先搜索(DFS)算法以向深运动的方式遍历图形,并使用堆栈记住在任何迭代中发生死角时获取下一个顶点以开始搜索。 如在上面给出的示例中,DFS算法首先从S到A到D到G到E到B,然后到F,最后到C.它使用以下规则。 Rule 1 - 访问相邻的未访问顶点。 将其标记为已访问。 显示它。 将其推入堆栈。 Rule 2 - 如果未找到相邻顶点,则从堆栈中弹出一个顶点。 (它将弹出堆栈中的所有顶点,这些

  • 本文向大家介绍什么是深度优先搜索?相关面试题,主要包含被问及什么是深度优先搜索?时的应答技巧和注意事项,需要的朋友参考一下 如算法名称那样,深度优先搜索所遵循的搜索策略是尽可能“深”地搜索树。它的基本思想是:为了求得问题的解,先选择某一种可能情况向前(子结点)探索,在探索过程中,一旦发现原来的选择不符合要求,就回溯至父亲结点重新选择另一结点,继续向前探索,如此反复进行,直至求得最优解。深度优先搜索