我正在刷新不同的树遍历方法,最后阅读了以下维基百科article。正如所料,对于二叉树,有三种深度优先遍历方法:
然后,文章继续处理任意(通用)树的深度优先遍历。为方便起见,我把它贴在这里:
// 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是子节点的数量。根据问题而定 手,预订,有序或后订单操作可能无效,或 您可能只想访问特定的子节点,因此这些操作 应该被认为是可选的。另外,在实践中不止一个 可能需要预订,有序和下订单操作。对于 例如,当插入三元树时,预订操作是 通过比较项目来执行。可能需要下订单操作 之后重新平衡树。
指定的算法对我没有意义,因为它是根据未定义的操作指定的:
为了增加混乱,我无法根据我所知道的以及维基百科文章中的内容提出所述操作的定义。我一直在困惑这一段时间没有真正的突破。我有以下问题:
答案 0 :(得分:6)
所述算法确实是正确的。在这种情况下发生的事情是维基百科文章包含一段代码,用于处理处理预订,订单和后序遍历的一般情况。
您可以将preorder,inorder和postorder遍历视为更通用算法的特殊情况。具体来说,假设您想要在搜索期间(预订,订购或后订购)的特定时间进行树遍历并执行某些操作。考虑这一点的一种方法是在访问当前节点之前执行一些预订操作,在访问节点的子节点和节点本身之间执行一些顺序操作,以及在访问节点之后执行一些后序操作。任何这些操作都可以“什么都不做”。例如,一个简单的前序遍历将被指定为
同样,后序遍历将是
维基百科代码的优势在于它允许您执行需要预订和后期订单步骤的操作。例如,假设您要进行树搜索,但在每个时间点跟踪已访问但尚未完成的节点。你可以这样做:
有些算法,比如Tarjan's SCC algorithm,实际上做了这样的事情(虽然不可否认这是一个图算法,问题与树有关)。维基百科代码因此给出了一般情况,其中更常见的情况,加上这个更高级的情况,是特殊情况。
希望这有帮助!