任何时候树的遍历都有效吗?

Does any traversal of a tree work any time?

这可能更像是一个理论(或数学)问题:

给定一棵有限树,如果我可以使用树的 post 顺序遍历来执行一个操作(例如,找到最低共同祖先),那么是否可以保证我能够找到解决方案也使用其余两个遍历中的任何一个(按顺序和预先顺序)?

如果否,那么我们如何确定哪种遍历适用于给定情况?如果是,那么 'ease of implementation' 是决定使用哪一个的一个因素吗?

谢谢!

编辑:我问这个问题是因为如果我们不使用特定的遍历,有时做某事并不是很直接。例如,在 method 2 of this post 中,我们考虑了左右子树返回的值(一切都很好,因为我们使用的是 post 顺序遍历)。如果我们使用任何其他遍历,那么它就不会这么简单。

基本上没有。

或者至少,效率不高。有了足够的脚手架和口香糖,您可以构建一个算法,该算法执行多个后序遍历以有效地实现中序或前序遍历(反之亦然和混合匹配),但多次遍历的效率远低于单次遍历使用适当的遍历顺序。

对于许多基于树的数据结构,可能的遍历远不止三种,因为没有宇宙法则要求对树的每个节点执行相同的遍历顺序。 (例如,当您开始查看已被解析为抽象语法树的程序的编译时,这一点变得非常明显。)

对于复杂的树遍历,有时需要构建一个数据依赖图,该图可用于确保每个节点计算所需的输入在适当的时间点可用。甚至在某些情况下,树遍历本身是由处理此类依赖关系图输出的程序生成器创建的。

如果算法不改变树,则可以使用惰性求值实现任意计算顺序。实际上,这会将树修改为数据依赖图,然后迭代地减少数据依赖图(如果可能;如果图是圆形的,那将不起作用)。然而,这并不是真正的简化。