使用给定遍历验证二叉树

时间:2014-11-06 14:32:01

标签: algorithm tree binary-tree tree-traversal

是否有可能在给定两次遍历的情况下识别没有二叉树存在的序列(例如:顺序和后顺序遍历)?

据我所知,后序遍历的最后一个元素,或者预先遍序遍历的第一个元素,是树的根。使用这样的基本事实,是否可以在不实际构建树的情况下测试这些数组并找出它们是否生成相同的树?

我已经有一个算法可以用这两个序列构建一个树(在 - 和 - 后),但如果有办法预先测试数组,我不想运行算法。它可以节省大量时间,而不是运行算法并在最后查找。

注意:这不一定是二叉搜索树。二叉树就足够了。

2 个答案:

答案 0 :(得分:1)

我重新开始,因为问题与我想的有点不同。给定一个inorder和postorder遍历,你能找到是否有一棵树可以生成它们吗?

让我们考虑这棵树:

     a
   /   \
  b     e
 / \   / \
c   d f   g

遍历是:

inorder:    CBDAFEG
postorder:  CDBFGEA

现在有些意见:

一个。后序中的最后一个节点始终是根节点。

b如果您知道根节点,则可以将inorder遍历拆分为left-traversal,root,right-traversal。

因此,您可以在不创建树的情况下运行递归算法,以确定它们是否可以由同一棵树生成。

像这样:

鉴于Io和Po是两个人,

如果长度不同,则没有共同的树。

如果长度相同:

  1. 取Po的最后一个节点 - 称之为R
  2. 在Io中找到R.如果没有找到,则没有共同的树。
  3. R确定左右子树的边界,因此根据Io中R的位置分割Io和Po:

    CBD A FEG

    CDB FEG A

  4. (例如,一旦你知道左子树必须是3个节点长,右边的sig树也是3个节点长,你也可以用同样的方式分割Po)

    1. 在左右子树上递归调用此算法。

答案 1 :(得分:0)

我不认为你可以在一般情况下这样做,因为你无法从遍历中确定树的结构。也就是说,有许多树生成相同的遍历。

例如,这里有两棵具有相同有序遍历的树。

  A                       A
 / \                     /
B   C                   B
                       /
                      C

但是他们的帖子顺序遍历是不同的。因此,如果使用相同的树来生成它们,则无法说明有序和后序遍历。