【发布时间】:2012-02-13 07:05:05
【问题描述】:
我正在复习不同的树遍历方法并最终阅读了以下*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 是子节点的数量。根据问题 手,预购,中购或后购操作可能无效,或 你可能只想访问特定的子节点,所以这些操作 应该被认为是可选的。此外,在实践中不止一种 可能需要进行预购、中购和后购操作。为了 例如,当插入三叉树时,预排序操作是 通过比较项目来执行。可能需要进行后订购操作 之后重新平衡树。
指定的算法对我来说毫无意义,因为它是根据未定义的操作指定的:
- 预购操作。
- 后订购操作。
- 顺序操作。
为了增加混乱,我无法根据我所知道的和*文章中的内容来定义上述操作。我一直对此感到困惑,但没有真正的突破。我有以下问题:
- *文章中指定的算法是否错误?我怀疑是这样,但除了指定不明确的事实之外,不能肯定地说任何话。
- 是否为通用树定义了后序、前序、中序深度优先遍历?这些实用吗?是否与三个操作的定义有关?如果是这样,怎么做?
- 如果算法确实是正确的,有人可以为我定义上述操作并解释它是如何工作的吗?
【问题讨论】:
-
你的意思是,你不知道什么是inorder/preorder/post order操作?
-
@Poonam,我不知道这些操作在算法上下文中意味着什么。通常,我会将其视为在一个“父”节点及其所有子节点上工作的相应遍历(前序/后序/中序)的一个步骤。
-
@Poonam,我已经阅读了*的文章和一堆其他定义这些东西的东西。只是为了确保,我也通读了你的 PDF。我很清楚后序/预序/中序遍历是如何工作的,如何使用堆栈递归/迭代地对它们进行编码。我特别挂断的是在这种情况下对这些操作的定义以及如何同时完成这三个操作。 templatetypedef 的回答清除了大部分内容,但我仍然对如何定义单个此类操作感到困惑。
-
@Poonam,我之前的评论没有冒犯的意思。我只是在澄清我的问题。我将不胜感激单个 preorder/postorder/inorder 操作的良好定义。对于通用树,考虑一个节点 A,其子节点为 a1、a2、...、an。前序操作是否定义为按照 A、a1、a2、...、an 的顺序访问?我想变得非常具体,并且 100% 确定。
-
按顺序遍历左节点,如果左节点为空,则打印节点数据,然后打印数据的右侧再次从左侧开始工作,null找到打印数据,然后右节点和过程重复,在前序中,首先打印数据,然后到左树打印数据,然后向左打印数据,直到找到空值,然后向右并重复处理,对于后序,首先遍历左到空,然后从最后一个左节点的右侧遍历并重复处理,最后将打印数据,如果不让我知道,我假设您知道这些差异,我会举例说明
标签: algorithm data-structures tree depth-first-search tree-traversal