我对订单,预订和订单后的遍历感到困惑,特别是 这一个,预购:ABAB,邮政订单:BABA,按顺序:AABB。
我知道root是Pre和Post的第一个也是最后一个元素,但我不明白如何完成二叉树的构建。
答案 0 :(得分:3)
您的帖子含糊不清,并没有多大意义,但我会在解释,预订,发布订单和为您构建二叉树。
你的问题没有意义的一个原因是你没有为你在订购中描述的元素建立一个订单,ABAB BABA和AABB绝对没有任何东西可以用树来正确显示每个元素的去向(和每个元素都是一个字母吗?为什么它们重复?
你的问题没有意义的另一个原因是你似乎认为pre,pos和in order与创建二叉树有关,但事实并非如此。
Pre ordering,In Ordering和Post Ordering是Depth First Search的所有tree traversal算法类型。也就是说它们是导航树的方式,而不是创建树。您可以使用这些算法来查找元素,或者只是打印出树的所有内容,这对于只通过pointers链接节点的树特别有用(如同array based binary heap所示。 })。
想象一下下面的二叉树(所有例子都是一样的)
A
B C
D E F G
预订遍历是一种树遍历算法,您始终首先采用最左侧路径。当你不能走得更远的时候,你走下一个最左边的路径,并在下一个节点上递归地做同样的事情。在上面的示例树中,预订遍历将从根开始,(A)向左(A,B)再向左(D)不能向左移动所以然后向右(E)到最后你会最终得到以下遍历序列:A B D E C F G
顺序遍历类似于预先遍历,但不是在每一步显示,顺序遍历最深处它可以去,然后显示,如果它不能再深入,它会去备份,显示(因此'按'顺序),并再次递归地向右尝试同样的事情直到完成。在树示例中,我们实际上首先打印D,然后返回到B,打印B,然后打印E,然后打印到A,依此类推,因此最终输出将为D B E A F G C
。注意Wikipedias示例可能更有意义,因为它更复杂。
在后期顺序中,我们从下往上打印,我们在左子树中找到最深的节点,并在那里递归打印最深的节点,直到我们完成,转到右子树,最后打印根,例如: D E B F G C A
。同样,这个例子对维基百科更有意义,因为它们有一个更复杂的树。
如果你想构建一个树,有很多方法可以做到这一点,但它完全取决于你想要的那种排序结构。您想要二元结构还是n-ary结构?您是否关心哪个元素位于顶部,或者您只想要最小/最大(如pairing heap或二进制堆priority queue)?您是否有搜索条件,以至于树的每个部分的根必须相对于孩子或他们的父母更大/更小/其他条件? (如binary search tree)
This post也很好地解释了遍历,如果这还不够,它还解释了为什么你需要不同类型的排序,以便从具有正确连接的节点序列构造树(如果你的原始意图是复制二叉树结构)