为什么只有四个树遍历算法?那其他组合呢?

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

网络上有很多内容说明有4种树遍历算法。DFS-InOrder(lRr),PreOrder(Rlr),PostOrder(lrR)BFS-级别订单遍历

1)是否由于二进制搜索树的概念而获得了这些树的遍历? (即,左子树小于右子树,因此我们在右之前遍历左?)2)遍历树的其他组合如何?示例:右根,左根,右根,左根,并以水平顺序从“右”节点遍历?3)如果以上的树遍历组合有效,那么我想树遍历的时间复杂度相对于它们从左到前的对应关系将保持不变吗?4)在实际应用中,它们是否使用树遍历的正确优先组合?举个例子。

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

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

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

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

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

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

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

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

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

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

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

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