【问题标题】:Why are there only four tree traversal algorithms?为什么只有四种树遍历算法?
【发布时间】:2020-08-27 16:05:19
【问题描述】:

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

  • 深度优先搜索 - 按顺序(左-根-右)
  • 预购(根-左-右)
  • PostOrder(左-右-根)
  • 广度优先搜索 - 级别顺序遍历

这些树的遍历是不是因为二叉搜索树的概念而得到的? (即,左子树小于右子树,因此我们先从左到右?)

树遍历的其他组合呢?例如:Right-Root-Left,Right-Left-Root,Root-Right-Left,按Level-order我们从Right节点遍历?

如果上述树遍历的组合是有效的,那么树遍历的时间复杂度是否会相对于它们的左优先对应物保持相同?

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

【问题讨论】:

  • 也可以随机遍历每个节点的子节点。因此,您可以想到许多其他顺序(例如,依赖于子节点的某种值)。因此,这里有 3 个非常常见的遍历命令和许多不那么常见的遍历命令。
  • 如果你有一个二叉搜索树,你想以相反的顺序遍历,你会使用“right-root-left”。这只是一个反向中序遍历。而且,是的,它的计算复杂度与传统的中序遍历相同。
  • 很好的问题。值得更多的关注和回应。如果 ruakh 在他的回答中所说的关于其他类型的遍历是真的,我想知道为什么没有像他们的同行那样讨论或教授它们。

标签: algorithm binary-tree depth-first-search breadth-first-search tree-traversal


【解决方案1】:

这些树的遍历是不是因为二叉搜索树的概念而得到的? (即,左子树小于右子树,因此我们先从左到右?)

显然不是,因为这四个遍历,唯一对二叉搜索树有意义的是“中序”遍历。其他三个会乱序读取元素。

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

树遍历的其他组合呢?例子:Right-Root-Left,Right-Left-Root,Root-Right-Left,从Right节点开始按Level-order遍历?

一切皆有可能。您还可以以锯齿形顺序遍历,有时您在处理右孩子之前处理左孩子,有时反过来。 (或者,换一种说法:有时您将第一个孩子描述为“左”,将第二个孩子描述为“右”,有时则相反。)

如果上述树遍历的组合是有效的,我猜树遍历的时间复杂度相对于它们的左优先对应物将保持不变?

如果您的树结构包含指向子等的显式指针,并且您的遍历遵循这些指针,那么 - 是的:“左”和“右”只是名称,不会影响理论上的时间复杂度。但如果你的树结构是隐式的(例如,通常使用二叉堆),那么它可能取决于细节。

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

我确信存在涉及从最大元素到最小元素遍历二叉搜索树的实际应用程序。在这样的应用程序中,术语“左”和“右”很可能根据较小值先出现(在左侧)的约定进行分配,因此从最大到最小的遍历将从“结束”开始树的最右边的节点,然后朝着它的“开始”前进,意思是它的最左边。

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

【讨论】:

  • 还有一些像Euler tree traversal这样的树遍历,就在这里添加...
  • @SomeDude:有趣的一点。从问题的全文来看,我很确定OP 意味着遍历二叉树的所有节点;但你说得对,他只“树遍历”,这可能指的是非常不同的东西,例如遍历二进制文件的所有树,或遍历某种其他类型的“树”(例如 n-ary 树或无向树)的所有节点。 . .或者,见鬼,它可能是something like this
【解决方案2】:

还有一种遍历 en.wikipedia 也没有考虑:

高度遍历。从高度为 0 的叶子/节点开始,按高度向上提升树的高度。

实施的无用和逆境被视为毫无意义的练习。

【讨论】:

    猜你喜欢
    • 2015-05-09
    • 1970-01-01
    • 1970-01-01
    • 2013-04-21
    • 1970-01-01
    • 2017-03-14
    • 2019-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多