Pre Order、In order 和 Post Order 树遍历

Pre Order, In order, and Post Order Tree Traversals

我对顺序、预序和 post-顺序遍历感到困惑,特别是 这个,预购: ABAB, Post 订购: BABA, 订购: AABB.

我明白根是Pre的第一个和最后一个元素Post,但是我没明白如何完成二叉树的构造。

您的 post 含糊不清,没有多大意义,但我会先按 post 顺序解释并为您构建二叉树。

你的问题没有意义的原因之一是你没有为你描述的元素建立顺序,ABAB BABA 和 AABB 没有树来正确显示每个元素的位置绝对没有任何意义(每个元素都是一个字母吗?为什么它们会重复)

您的问题没有意义的另一个原因是您似乎认为 pre、pos 和 in order 与创建二叉树有关,但事实并非如此。

Pre ordering, In Ordering, and Post Ordering are all types of Depth First Search algorithms for tree traversal. That is to say they are ways of navigating a tree, not creating one. You may use these algorithms to find elements, or to simply print out all the contents of a tree, this is especially useful to a tree who's nodes are only linked via pointers (as apposed to say, an array based binary heap)。

想象一下下面的二叉树(所有示例都相同)

     A
   B   C
  D E F G

预序遍历是一种树遍历算法,您始终首先采用最左边的路径。当你不能走得更远时,你就走下一个最左边的路径,并在下一个节点上递归地做同样的事情。在上面的示例树中,前序遍历将从根开始,(A) 向左走 (A,B) 再次向左走 (D) 不能向左走所以会向右走 (E) 最后你会最终得到以下遍历序列:A B D E C F G

中序遍历和前序遍历类似,只是不是每一步都显示,而是先遍历到最左边能走的最深,然后再显示,如果再不够深,它返回,显示(因此 'in' 顺序),并递归地再次向右尝试相同的事情,直到完成。在树的例子中,我们实际上首先打印 D,返回到 B,然后打印 B,然后打印 E,然后返回到 A,依此类推,所以最终输出将是 D B E A F G C。注意维基百科示例可能更有意义,因为它更复杂。

按照post的顺序,我们本质上是从下往上打印,我们在左子树中找到最深的节点,并递归打印最深的节点,直到我们完成,转到右子树并最后打印根,例如:D E B F G C A。同样,这个例子对维基百科更有意义,因为它们有更复杂的树。

如果你想构造一棵树,有很多方法可以实现,但这完全取决于你想要什么样的排序结构。你想要二元结构还是n元结构?你关心哪个元素在上面,还是你只想要 min/max(比如 pairing heap or binary heap priority queue)? Do you have a search condition, such that the roots of each part of a tree must be larger/smaller/other condition relative to the children or their parents? (like a binary search tree

也很好地解释了遍历,如果这还不够的话,它还解释了为什么你需要不同类型的排序以便从具有适当连接的节点序列构建树(如果你的原意是复制一个二叉树结构)