是否有任何时间遍历树?

时间:2018-02-08 01:10:41

标签: algorithm tree tree-traversal

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

给定一个有限的树,如果我可以使用树的后序遍历进行一次操作(比如找到最低的共同祖先),那么可以保证我能够使用其余任何一个找到解决方案两次遍历(按顺序和预订)?

如果不是,那么我们如何确定哪种遍历适用于特定情况?如果是,那么在决定使用哪一个时,“易于实施”是一个因素吗?

谢谢!

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

1 个答案:

答案 0 :(得分:1)

基本上没有。

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

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

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

如果算法不改变树,则可以通过使用延迟评估来实现任意任意计算顺序。实际上,它将树修改为数据依赖关系图,然后迭代地减少数据依赖关系图(如果可能;如果图是循环的,则不起作用)。然而,这并非真正的简化。