【问题标题】:Verify Binary Tree Using Given Traversal使用给定遍历验证二叉树
【发布时间】:2014-11-06 23:34:09
【问题描述】:

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

我了解后序遍历的最后一个元素或前序遍历的第一个元素是树的根。使用这样的基本事实,是否可以在不实际构建树的情况下测试这些数组并确定它们是否生成相同的树?

我已经有一个算法可以从这两个序列(in-和post-)中构建一棵树,但是如果有办法预先测试数组,我不想运行该算法。这将节省大量时间,而不是运行算法并在最后发现。

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

【问题讨论】:

  • 我不明白 - 任何序列都不能存储在二叉树中吗?
  • 是的,但是如果给你一个顺序和后序遍历作为你的两个序列,你怎么知道它们是否来自同一棵树?
  • 现在清楚多了。

标签: algorithm tree binary-tree tree-traversal


【解决方案1】:

我又开始了,因为这个问题与我想象的有点不同。给定一个中序和后序遍历,你能找到是否有一棵树可以同时生成它们吗?

让我们考虑一下这棵树:

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

遍历是:

inorder:    CBDAFEG
postorder:  CDBFGEA

现在有一些观察:

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

b 如果您知道根节点,您可以将中序遍历拆分为左遍历、根、右遍历。

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

像这样:

假设 Io 和 Po 作为两个遍历,

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

如果长度相同则:

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

    CBD A FEG

    CDB FEG A

(例如,一旦你知道左子树必须有 3 个节点长,而右​​ sig 树也有 3 个节点长,你也可以用同样的方法拆分 Po)

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

【讨论】:

    【解决方案2】:

    我认为您不能在一般情况下这样做,因为您无法仅从遍历中确定树的结构。那就是有许多树产生相同的遍历。

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

      A                       A
     / \                     /
    B   C                   B
                           /
                          C
    

    但是他们的后序遍历是不同的。因此,如果使用相同的树来生成它们,就不可能说给定的中序遍历和后序遍历。

    【讨论】:

    • 这不一定是真的。给定中序和后序遍历,可以构造二叉树。请参阅:geeksforgeeks.org/… 我只是想知道是否可以在实际构建树之前进行验证。
    • 这是一个不同的问题。可以确定有序序列和后序序列是否具有共同生成它们的树。但反之则不然 - 给定中序遍历和后序遍历,您不能保证使用相同的树来生成它们。
    • 啊,我明白你的意思了。这就是我想知道的。由于您不能保证使用同一棵树来生成两个遍历,有没有办法识别树不同的序列?现在我有一个程序,给定由同一棵树产生的两个序列,可以重建该树。但是,如果这两个序列不产生相同的树,我想避免整个重建尝试以节省时间。那可能吗?还是简单地尝试重建并在最后找出答案更容易?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    • 2022-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    相关资源
    最近更新 更多