我学习了不同的树遍历方法,最后阅读了下面的wikipediaarticle。如所料,有三种方法可以对二叉树进行深度优先遍历:
前序遍历
后序遍历
顺序遍历
本文接着讨论任意(通用)树的深度优先遍历。为了方便,我把它贴在这里:

// 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是子节点的数目。取决于
下单前、下单中或下单后操作可能无效,或
您可能只想访问特定的子节点,因此这些操作
应该被认为是可选的。而且,实际上
可能需要订单前、订单中和订单后操作。为了
例如,当插入三叉树时,预排序操作是
通过比较项目来执行。可能需要订单后操作
然后重新平衡这棵树。
指定的算法对我来说毫无意义,因为它是根据未定义的操作指定的:
预定的操作。
下单后的操作。
有序的操作。
更让人困惑的是,我无法根据我所知道的和维基百科文章中的内容来定义上述操作。我对此困惑了一段时间,但没有真正的突破。我有以下问题:
维基百科文章中指定的算法是错误的吗?我想是的,但除了说得不明确之外,不能肯定地说什么。
是否为泛型树定义了后序、前序、顺序深度优先遍历?这些是实际使用的吗?它与三种操作的定义有关吗?如果是,怎么做?
如果算法确实正确,有人能为我定义上面的操作并解释它是如何工作的吗?

最佳答案

所述算法确实正确。在本例中发生的情况是,wikipedia文章包含一段代码,用于处理一个通用的案例,该案例同时处理前序、序和后序遍历。
您可以将前序、序和后序遍历都看作是更通用算法的特例。具体地说,假设您想要遍历一个树,并在搜索过程中的某个特定时间执行某个操作(preorder、inoorder或posterorder)。考虑这一点的一种方法是,在访问当前节点之前执行一些顺序操作,在访问节点的子节点和节点本身之间执行一些顺序操作,在访问节点之后执行一些顺序操作。这些操作中的任何一个都可以是“不做任何事情”。
预订单步骤:做你想做的操作
顺序步骤:禁止操作
后序步骤:无操作
类似地,后序遍历将是
预订单步骤:无操作
顺序步骤:禁止操作
PostOrder步骤:执行要执行的操作PostOrder
wikipedia代码的优点是,它允许您执行需要预订单和后订单步骤的操作。例如,假设您要执行树搜索,但在每个时间点跟踪哪些节点已被访问但尚未完成。你可以这样做:
预排序步骤:将当前节点添加到“活动”列表中。
顺序步骤:禁止操作
后序步骤:从“活动”列表中删除当前节点。
有些算法,比如Tarjan's SCC algorithm,实际上是这样做的(尽管不可否认,这是一个图算法,问题与树有关)。因此,维基百科代码给出了一般情况,其中更常见的情况,加上这个更高级的情况,是特殊情况。
希望这有帮助!

10-06 13:52