了解维基百科代码的通用深度优先树搜索?

时间:2012-02-13 07:05:05

标签: algorithm data-structures tree depth-first-search tree-traversal

我正在刷新不同的树遍历方法,最后阅读了以下维基百科article。正如所料,对于二叉树,有三种深度优先遍历方法:

  1. 预订遍历
  2. 后序遍历
  3. Inorder遍历
  4. 然后,文章继续处理任意(通用)树的深度优先遍历。为方便起见,我把它贴在这里:

    // To traverse a non-empty tree in depth-first order,
    // perform the following operations recursively at each node:
    Perform pre-order operation
    for i=1 to n-1 do
        Visit child[i], if present
        Perform in-order operation
    
    Visit child[n], if present
    Perform post-order operation
    

    以下是维基百科提供的所有解释:

      

    其中n是子节点的数量。根据问题而定   手,预订,有序或后订单操作可能无效,或   您可能只想访问特定的子节点,因此这些操作   应该被认为是可选的。另外,在实践中不止一个   可能需要预订,有序和下订单操作。对于   例如,当插入三元树时,预订操作是   通过比较项目来执行。可能需要下订单操作   之后重新平衡树。

    指定的算法对我没有意义,因为它是根据未定义的操作指定的:

    1. 预订操作。
    2. 后序操作。
    3. 有序操作。
    4. 为了增加混乱,我无法根据我所知道的以及维基百科文章中的内容提出所述操作的定义。我一直在困惑这一段时间没有真正的突破。我有以下问题:

      1. 维基百科文章中指定的算法是错误的吗?我怀疑它是,但除了它是不明确的事实之外,不能肯定地说什么。
      2. 是否为通用树定义了后序,预订,深度优先遍历?这些实际使用过吗?它与三个操作的定义有关吗?如果是这样,怎么样?
      3. 如果算法确实正确,有人可以为我定义上述操作并解释它是如何工作的吗?

1 个答案:

答案 0 :(得分:6)

所述算法确实是正确的。在这种情况下发生的事情是维基百科文章包含一段代码,用于处理处理预订,订单和后序遍历的一般情况。

您可以将preorder,inorder和postorder遍历视为更通用算法的特殊情况。具体来说,假设您想要在搜索期间(预订,订购或后订购)的特定时间进行树遍历并执行某些操作。考虑这一点的一种方法是在访问当前节点之前执行一些预订操作,在访问节点的子节点和节点本身之间执行一些顺序操作,以及在访问节点之后执行一些后序操作。任何这些操作都可以“什么都不做”。例如,一个简单的前序遍历将被指定为

  • 预购步骤:执行您要预先安排的操作
  • Inorder step:No-op
  • 后序步骤:No-op

同样,后序遍历将是

  • 预购步骤:No-op
  • Inorder step:No-op
  • 后序步骤:执行您要进行的后续操作

维基百科代码的优势在于它允许您执行需要预订和后期订单步骤的操作。例如,假设您要进行树搜索,但在每个时间点跟踪已访问但尚未完成的节点。你可以这样做:

  • 预订步骤:将当前节点添加到“活动”列表中。
  • Inorder step:No-op
  • 后序步骤:从“活动”列表中删除当前节点。

有些算法,比如Tarjan's SCC algorithm,实际上做了这样的事情(虽然不可否认这是一个图算法,问题与树有关)。维基百科代码因此给出了一般情况,其中更常见的情况,加上这个更高级的情况,是特殊情况。

希望这有帮助!