如何从给定的遍历中找到二叉树?

时间:2009-09-06 16:01:24

标签: c binary-tree traversal

如何从给定的遍历方法(按序,后序或预订)中找到二叉树?

4 个答案:

答案 0 :(得分:3)

有关订购,订购后预订树遍历的维基百科文章如下:

http://en.wikipedia.org/wiki/Tree_traversal

您要查找的树从与您的搜索字词匹配的节点开始。

答案 1 :(得分:3)

只有一次遍历(有序,预购或后序),你无法做到这一点。

如果Inorder&给出了树的前序遍历:

  1. 预订的第一个元素是树的根。 (假设它是A)
  2. 在Inorder中的Searc root所以所有root的左边的节点都是左子树的顺序,右边的节点是右子树的顺序。计算根左侧的节点数量L。
  3. 来自第二L节点的后序将是左子树的预先排序,之后是右子树的预订。
  4. 因此我们找到了根元素并将我们的顺序分为左子树顺序,右子树顺序和左子树预先排序和右子树预顺序。所以我们可以通过递归来做到这一点,直到只剩下一个节点。

    同样,我们可以为Inorder和Postorder做,其中root将是后期订单的最后一个元素。

答案 2 :(得分:1)

如果你想使用遍历结果恢复原始树,那么我有一些坏消息 - 没有明确的解决方案。会有几棵树可以产生相同的遍历结果。

例如,对于inorder遍历以下树将产生相同的结果:1, 2, 3

    2           3       1
   / \         /         \
  1   3       2           2
             /             \
            1               3

答案 3 :(得分:1)

(好的,既然我们已经确定amended question应该在这里,也可以在那里发布我的答案)

  

下面给出了二叉树的Postorder和Inorder遍历。是否可以从这些遍历中获取唯一的二叉树?

有可能。

在后序遍历(左右根)中,整个树的根节点始终是最后一个(在您的情况下,它是A)。在inorder遍历(左 - 右 - 右)中,根之前的节点属于左子树,而根之后的节点属于右子节点。由于我们已经确定了根,我们可以确定左子树和右子树中的节点。

确定后,我们可以在后序列表中分隔左右子树。所以,现在我们确定了左右子树和根节点:

postorder: left|right|root
inorder  : left|root|right

现在我们只需递归构造左右子树。鳍。