为什么只有四个树遍历算法?

问题描述 投票:0回答:2

网络上有很多内容说明有四种遍历算法:

  • 深度优先搜索-顺序(从左到右)
  • PreOrder(Root-left-right)
  • PostOrder(left-right-Root)
  • 宽度优先搜索-级别顺序遍历

这些树遍历是否由于二叉搜索树的概念而获得? (即,左子树比右子树小,因此我们先向左走,然后再向右走?)

关于树遍历的其他组合呢?例如:右向左,左向,左向和左向,并且在水平顺序中我们从“右”节点遍历?

如果以上树遍历的组合是有效的,那么树遍历的时间复杂度相对于它们的从左到前的对应关系是否保持相同?

在现实世界的应用程序中,它们是否使用树遍历的正确优先组合?举个例子。

algorithm binary-tree depth-first-search breadth-first-search tree-traversal
2个回答
0
投票

这些树遍历是否由于二叉搜索树的概念而获得? (即,左子树小于右子树,因此我们在右之前遍历左?)

显然不是,由于这四个遍历,对于二叉搜索树唯一真正有意义的是“有序”遍历。其他三个将读取乱序的元素。

相反,我认为二叉树的约定(至少在英语国家中)是将第一个孩子称为“左”,第二个孩子称为“右”,并在绘制视觉表示时相应地绘制它们。该约定既适用于二叉搜索树(第一个子项包含父项之前的所有值,第二个子项包含父项之后的所有值),也适用于树遍历(我们在第二个子项之前遍历第一个子项)。

关于树遍历的其他组合呢?示例:右根-左根,右-左根,根-右-根左,并以水平顺序从“右”节点遍历?

完全有可能。您也可以按曲折顺序遍历,有时在左孩之前处理右孩,有时则相反。 (或者,换种说法:有时您将第一个孩子描述为“左”,而第二个孩子描述为“右”,有时则相反。)

如果上述树遍历的组合是有效的,我想树遍历的时间复杂度相对于它们从左到前的对应关系将保持不变?

[如果您的树结构包含指向子级的显式指针,依此类推,则遍历遵循这些指针,那么-是的:“ left”和“ right”只是名称,并不影响理论上的时间复杂性。但是,如果您的树结构是隐式的(例如,通常使用二进制堆完成),则它可能取决于细节。

在现实世界的应用程序中,它们是否使用树遍历的正确优先组合?举个例子。

我肯定存在现实世界中涉及从最大元素到最小元素遍历二叉树的应用程序。在这样的应用程序中,术语“左”和“右”很可能是基于以下约定来分配的:较小的值首先出现(在左侧),因此从最大到最小的遍历将在“结束”处开始树的意思是它的最右边的节点,然后朝它的“起点”(意思是它的最左边)前进。

但是,最明显的例子是使用ORDER BY ... DESC子句查询SQL表;并且我相信主要的SQL实现使用排序的B树,而不是专门的二进制搜索树,因此它们可能不使用术语“左”和“右”。


0
投票

也有一种类型的遍历en.wikipedia也没有考虑:

高度遍历。从高度为0的叶子/节点开始,按高度增加树的高度。

实施的无用性和逆境是毫无意义的练习。

© www.soinside.com 2019 - 2024. All rights reserved.