二叉树前后遍历的有用性


13

这可能很幼稚,但是我想知道,它是所有遍历类型的二叉树(普通树,排序树和平衡树)的上下文:

  • 深度优先预购
  • 深度优先
  • 深度优先后继
  • 广度优先

预购和后购商品的实际用途是什么?我的意思是,是否存在某种类型和/或配置的二叉树,其中前顺序和/或后顺序遍历将比其他两个具有(某些)优势?

AFAICS,二进制树的某些类型和配置对于顺序和广度优先的二进制树可能具有一定的优势:

  • 对于平衡二叉树,与深度优先相比,任何深度优先遍历将使用较少的内存存储空间(例如,对于6或7个节点的平衡二叉树,高度为2,因此任何深度优先遍历将需要存储最大值为在任何给定时间有2个节点,而最后一级有3个或4个节点,因此广度优先遍历在某个点最多需要存储3个或4个节点。在这种情况下,使用有序遍历将占用最少的内存,并以其自然顺序访问节点。

  • 对于不平衡的二叉树,如果它接近最坏情况的插入方案,则与深度优先遍历相比,广度优先遍历将减少占用的内存。因此,在这种情况下,广度优先提供了优势。顺序遍历又具有按其自然顺序访问值的优点。

但是,我无法想到在遍历前后都比其他两个更有利的情况。

Answers:


13

您需要用树做各种事情,例如在数据结构和某种串行表示之间进行转换,例如在文件或语言上。

因此,例如,假设您有一个解析树,如下所示:

    *
   / \
  +   \
 / \   \
A   B   C

您可以序列化它,方法是* + A B C按前缀顺序A B + C *遍历,或按后缀顺序遍历。如果您完全使用语言处理器,那么这些事情就必须属于第二类。


很好的例子!并注意按顺序遍历将如何产生A + B * C,这对于普通用户而言比后缀顺序的任何前缀都容易理解。
Kilian Foth,

3
@KilianFoth除非那棵树没有说什么-至少对我来说,它说(A + B)*C。虽然我的HP-28s手指像AB + C *版本一样好。:-)
SDG

@Kilian:sdg是正确的。使用inorder时,除非在所有内容之间加上括号,否则您必须关心优先级。
迈克·邓拉维

13

维基百科的文章有,当你想使用不同类型的深度优先搜索的一个很好的简要说明:

  • 在复制节点和值时进行预遍历可以完全复制二叉树。它也可以用于从表达式树制作前缀表达式(波兰语表示法):顺序遍历表达式树。
  • 按顺序遍历在二进制搜索树上非常常用,因为根据设置二进制搜索树的比较器(因此得名),它按顺序从基础集合中返回值。
  • 删除或释放节点和值时的后序遍历可以删除或释放整个二叉树。它还可以生成二叉树的后缀表示。

它归结为算法的后勤需求。例如,如果您在删除过程中不使用后遍历,那么您将丢失删除子树所需的引用。


截至2019年11月10日的Wikipedia进行了更改,第一个描述也属于Post-Order,这令人困惑。这就是我最终在这里寻找其他信息来源的原因。
whoan

5

使用不同的算法来处理二叉树的目的不是要对树做事。在此抽象级别上,一个顺序在很大程度上与其他顺序一样好,因为您只能从过程中获得抽象符号。

但是树通常用来表示有趣的东西,这可能会在结果上产生很大的不同。例如,如果节点代表通过大域(甚至可能是无限域)进行的完整搜索中的搜索状态,则先降序还是先处理不但可以确定结果的查找顺序,还可以确定是否根本找不到任何解决方案。在无限域中,最容易看出这一点:如果您不谨慎地下降,则可能会忽略位于树中较高位置的解决方案,这仅仅是因为您走错了路。但是实际上,由于内存和磁盘也是有限的,所以这甚至适用于非常大的域,而不是真正的无限域。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.