当 Inorder 遍历一棵树导致 E A C K F H D B G 时,前序等价物是啥?

Posted

技术标签:

【中文标题】当 Inorder 遍历一棵树导致 E A C K F H D B G 时,前序等价物是啥?【英文标题】:When Inorder traversing a tree resulted E A C K F H D B G, what would be the preorder equivalent?当 Inorder 遍历一棵树导致 E A C K F H D B G 时,前序等价物是什么? 【发布时间】:2016-09-23 09:08:29 【问题描述】:

我无法绘制这棵树,因为我不知道何时将值放在树的右侧或左侧,因为它由字母组成。

如何确定?

编辑添加: 作为可能的前序遍历,我有以下选择:

A.  F A E K C D B H G
B.  F A E K C D H G B
C.  E A F K H D C B G
D.  F E A K D C H B G 

【问题讨论】:

如果是字母或数字会发生什么变化? 【参考方案1】:

这个中序遍历有多个等价的前序。您无法仅从字母中分辨出原始树结构是什么,因为没有括号对字母进行分组。

例如,这里有两种可能的树,它们会产生您所说的中序遍历,但具有不同的前序遍历。还有很多其他的。

顺序:E A C K F H D B G 预购:F K A E C D H B G

顺序:E A C K F H D B G 预购:K A E C H F D G B


更新

根据您的 cmets,我发现这实际上是某种测试或作业问题。既然你得到了中序遍历和一些可能的前序遍历,问题就变成了,我们可以重建一棵同时满足这两个排序的树吗?事实证明,是的,这绝对是可行的;您只需尝试每一个并解开谜题。

那么我们应该如何处理呢?那么,我们对中序遍历和前序遍历了解多少? 我们知道,中序遍历给出了树上节点从左到右的绝对顺序。相反,前序遍历列出从根开始向下的节点,总是首先列出当前节点,然后是左子树,然后是右子树。所以一种方法是遍历前序遍历(因为第一个字母给了我们根节点),并尝试将每个节点添加到树中,使用中序遍历作为指导来决定我们是否应该将该节点放置到前一个的左侧或右侧。

我们从哪个答案开始并不重要,所以让我们先尝试答案(D):F E A K D C H B G

    首先放置根节点,F:

                                  F
    

    显然,下一个节点 E 连接到 F,但它是左还是右?我们来看看中序遍历。 E在F之前还是之后?它在前面,这意味着它必须是左节点。

                                  F
                                 /
                                E
    

    接下来我们有 A。现在树中有三个开放点:E 的左侧、E 的右侧和 F 的右侧。在中序遍历中,A 在 E 之后但在 F 之前。所以这意味着它必须在 E 的右边。

                                  F
                                 /
                                E
                                 \
                                  A
    

    K 在预购中紧随其后。它应该去树的什么地方?中序者说 K 在 A 之后但在 F 之前。在树中与前序一致的 3 个开放点中(A 的左侧、A 的右侧或 F 的右侧),它唯一可以适合的位置是 A 的右侧.

                                  F
                                 /
                                E
                                 \
                                  A
                                   \
                                    K
    

    D 是下一个。中序遍历表明 D 必须在 F 之后,而我们的树中只有一个空余点适用于此:F 的右侧。

                                  F
                                 / \
                                E   D
                                 \
                                  A
                                   \
                                    K
    

    现在我们遇到了麻烦。根据预购顺序,下一个要放置的节点是 C。根据这个顺序,C 必须在 K 之前和 A 之后,这意味着将它放在 K 的左侧。但是,我们不能这样做,因为这会改变前序!请记住,预购顺序从上到下,从左到右,因此放置的每个新节点要么必须直接位于最后放置的节点的下方,要么位于树中它的上方和右侧。我们放置的最后一个节点是 D,这意味着 C 必须连接到它以满足预购。但是如果C连接到D,它就不能连接到K。所以我们有一个矛盾。这意味着答案 (D) 不是正确的解决方案。

希望您现在了解如何遍历遍历并从中构建树。我将留给您尝试其他三个答案并找出其中哪个是正确的。

【讨论】:

这是一道选择题,您指定的预排序不在其中一个选项中。使用选项编辑问题。【参考方案2】:

这个问题的答案是 b) FAEKCDHGB

【讨论】:

【参考方案3】:

使用从中序和前序遍历构造树的技术,并使用选项 A、B、D 中给出的中序和前序遍历绘制树 C 未被选中,因为从给定的中序我们可以看出 F(最内层或中间节点)是根节点,因为在中序遍历中,根位于左右子节点的中间。 因此,从这 4 个选项中,C 选项不能为真,因为预购 Root 在开始时,但在选项 C 中,根是 E,这是不可能的。所以 C 选项被丢弃 或者你可以绘制选项 C 的树 在绘制这三棵树之后,对每棵树进行前序遍历,并查看该遍历和给定的相应遍历(在我们构造相应树的给定选项中)是否相同,哪个答案相同就是我们的答案 在给定的情况下,从选项 B 构造的树的遍历将与选项 B 中给出的遍历相同,因此这是我们的答案。

【讨论】:

以上是关于当 Inorder 遍历一棵树导致 E A C K F H D B G 时,前序等价物是啥?的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 106. 从中序与后序遍历序列构造二叉树 c++/java详细题解

LeetCode -- Construct Binary Tree from Preorder and Inorder

C#解leetcode 106. Construct Binary Tree from Inorder and Postorder Traversal

105. 从前序与中序遍历序列构造二叉树

105. 从前序与中序遍历序列构造二叉树

Construct Binary Tree from Preorder and Inorder Traversal