【问题标题】:Is the Euler Tour algorithm essentially the same as Pre-order traversal?Euler Tour 算法本质上与 Pr​​e-order traversal 相同吗?
【发布时间】:2016-10-06 16:04:34
【问题描述】:

我正在尝试了解 Euler Tour 算法以及为什么它在树遍历中很受欢迎。但是,我看不出 Euler Tour 和 Pre-order 遍历树之间的区别。

假设你有树:

     A
    / \
   B   E
  / \   \
 C   D   F

如果您执行欧拉环算法,它将是:

A -> B -> C -> B -> D -> B -> A -> E -> F -> E -> A

但是这样做的目的是什么?看起来就像是完全相同版本的递归预购:

A -> B -> C -> D -> E -> F

显然,在 Euler Tour 中,路径中的每个节点值至少有两次,但这只是由于您在编程时算法的递归性质。如果您愿意,您可以进行与 Euler Tour 相同的计算……使用预购,对吗?

如果有人可以帮助解释 Euler Tour 以及为什么将它用于其他遍历,那将不胜感激。谢谢。

【问题讨论】:

    标签: data-structures tree tree-traversal graph-traversal preorder


    【解决方案1】:

    通过欧拉之旅,您可以从结果中获取更多信息。

    例如,您可以查看节点是否为叶子。如果节点的前任和后继节点相同,就会出现这种情况。

    此外,您还可以通过将每条向前腿的计数器加 +1 并为每条向后腿减去 1 来计算节点的深度。

    在处理算法中的树时,这些信息通常很有用。

    【讨论】:

      【解决方案2】:

      请注意,您的 Euler 之旅中也会显示后订购信息。如果只是列出每个节点的最后时间,我们得到

      C -> D -> B -> F -> E -> A
      

      很遗憾,我们无法从游览中获得中序(对称顺序)。在您的示例中,从节点E 及其子节点F 可以清楚地看到,我们实际上无法看到子节点是左还是右。

      欧拉遍历方法可以稍微扩展一下,以包括树的三个递归顺序(pre-in-post-)。按照树的轮廓,访问每个节点 3 次,在进入左孩子之前,在左右孩子之间,在右孩子之后。如果孩子失踪,请连续探视。

      我们可以通过以下方式扩展您的示例,在您之前的导览中添加数字:

      A1 -> B1 -> C123 -> B2 -> D123 -> B3 -> A2 -> E12 -> F123 -> E2 -> A3
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多