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