如何从给定的遍历方法(中序、后序或前序)中找到二叉树?
4 回答
您不能仅通过一次遍历(Inorder、Preorder 或 Postorder)来做到这一点。
如果给出了树的中序和前序遍历,则可以这样做:
- 预购的第一个元素将是树的根。(假设是A)
- 在 Inorder 中搜索根,因此根左侧的所有节点都是左子树的 Inorder,右节点是右子树的 Inorder。计算根左侧的节点数,例如 L。
- 在第二个 L 节点的后序中,将是左子树的前序,之后是右子树的前序。
所以我们找到了根元素,将我们的Inorder分为左子树的Inorder、右子树的Inorder和Preorder到左子树的前序和右子树的前序。所以我们可以通过递归来做到这一点,直到只剩下一个节点。
类似地,我们可以为 Inorder 和 Postorder 做,其中 root 将是 post order 的最后一个元素。
(好的,既然我们已经决定修改后的问题应该在这里,我也在那里发布我的答案)
下面给出二叉树的后序和中序遍历。是否有可能从这些遍历中获得唯一的二叉树?
有可能的。
在后序遍历(左-右-根)中,整个树的根节点始终是最后一个(在您的情况下是 A)。在中序遍历(左-根-右)中,根之前的节点属于左子树,根之后的节点属于右子树。由于我们已经确定了根,我们可以确定左子树和右子树中的节点。
确定后,我们可以在后序列表中分离左右子树。所以,现在我们已经确定了左右子树和根节点:
postorder: left|right|root
inorder : left|root|right
现在我们只需要递归地构造左右子树。鳍。
如果您想使用遍历结果恢复原始树,那么我有一些坏消息要告诉您 - 没有明确的解决方案。会有几棵树可以产生相同的遍历结果。
例如,对于以下树的中序遍历,将产生相同的结果:1, 2, 3
2 3 1
/ \ / \
1 3 2 2
/ \
1 3