【问题标题】:Is Pre-Order traversal on a binary tree same as Depth First Search?二叉树上的预序遍历与深度优先搜索相同吗?
【发布时间】:2014-02-05 08:08:29
【问题描述】:

在我看来,Pre-order traversal 和 DFS 与我们以深度方式遍历到叶节点的两种情况相同。如果我错了,有人可以纠正我吗?

提前致谢!

【问题讨论】:

标签: algorithm tree binary-tree depth-first-search preorder


【解决方案1】:

预购是 DFS 的一种。

深度优先遍历分为三种类型:前序、中序和后序。

查看here 了解更多信息。

【讨论】:

  • 在我看来问题不是在寻求高级答案,我认为他在寻找Pre-order DFS,这是计算机专业学生中称为“DFS”的短期。
  • 我认为他只是观察到,当所讨论的图也是一棵树时,DFS 的初始顶点是树的根,那么 DFS 和前序遍历是等价的。中序遍历对于 k > 2 的 k-ary 树没有意义。
  • 即使图是二叉树,前序树遍历的输出也不太可能与前导子图的遍历相同,除非顶点邻接列表在与树中的节点“孩子”相同的顺序。也就是说,图表示没有“左”和“右”孩子的概念。
  • 在二叉树上实际上有六种深度优先遍历——前序、后序、中序、逆序、逆序、逆序为了。这对应于三个操作(3!)的六个排列,其中操作是“向左”、“向右”和“进程节点”。
【解决方案2】:

不会的。预购具有访问左节点然后访问右节点的严格方式。但对于 DFS,它可以是任何一种,因为没有严格的时尚。因此,根据您压入堆栈的内容,存在不止一次遍历。

【讨论】:

    【解决方案3】:

    这可能取决于深度优先的定义和实现 算法。 Java Swing 的 JTree 的 DefaultMutableTreeNode 类 组件有以下用于树遍历的枚举方法:

    • depthFirstEnumeration()
    • postorderEnumeration()
    • preorderEnumeration()
    • breadthFirstEnumeration()

    在 Java Swing 的实现中,depthFirstEnumeration 是相同的 作为postOrderEnumeration。我的测试和official documentation 证实了这一点。

    其他人可以以不同的方式定义深度优先的含义。例如,一篇文章 on Wikipedia 声明前序和后序遍历是特定类型 深度优先遍历。这意味着深度优先遍历 不是具体的遍历算法。

    【讨论】:

      【解决方案4】:

      直观地说,由于我们在大多数实现中使用递归(即使用隐式堆栈数据结构)应用 DFS 算法的方式,它们的感觉是一样的。在大多数情况下(或所有情况),结果与预购遍历相同。

      DFS 的想法是选择一个分支并深入其中,彻底探索它。然而,选择分支和向下的方式取决于您正在实施的DFS类型。只是为了完成,在BFS算法中,我们逐层遍历

      请记住,预购只是一种 DFS。我们还有其他方法,如下所示。

      图片来源:Base CS

      为了更好地理解,请参考this blog 甚至this one

      【讨论】:

        猜你喜欢
        • 2019-01-08
        • 2019-08-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多