【问题标题】:Construct a (non-binary) tree from pre-order and post-order traversal从前序和后序遍历构造一个(非二叉树)树
【发布时间】:2014-02-21 00:15:24
【问题描述】:

我将要使用的树由具有左子节点和右兄弟节点的节点组成。除了左孩子,兄弟姐妹不会连接到父节点。

我需要从预购列表和后购列表重构树。

示例 - 下面第一行是预购,第二行是后购。

QRUVSTWXZY 
UVRSWZXYTQ

树看起来像这样:

      Q
   /  |  \
  R   S   T
 / \    / | \
U   V  W  X  Y
          |
          Z

我对如何遍历这两个列表并构建一棵树有一个模糊的想法,但我的逻辑一直在碰壁。

谁能推荐一种算法或方法,可以遍历两个列表并找到一个结构?

【问题讨论】:

标签: algorithm tree


【解决方案1】:

您需要做的就是比较两个列表,我们使用一个简单的想法,即父节点在前序中总是在其子节点之前,而在后序中则相反。 第1步 如果前序中的第一个元素等于后序中的最后一个元素,则将其从左出列表的根节点(父节点)中删除,并将其从两个列表中删除。 Qruvstwxzy-->ruvstwxzy uvrswzxytQ-->uvrswzxyt 第2步 现在比较两个列表(新)第一个位置的元素是先前删除的节点的直接子元素现在将字符串分隔为子字符串,直到相同的元素出现在后序列表中。现在迭代地对现在遗漏的字符串做同样的事情 Ruvstwxzy--> Ruv S Twxzy uvRswzxyt--> uvR S wzxyT 第三步 如果在这个迭代中我们得到一个包含一个元素的字符串,那么它是一个叶子节点,并且是整个字符串的父节点的直接子节点。

通过反复执行此操作,我们将获得您想要获得的确切树。

【讨论】:

    【解决方案2】:

    定理1:当且仅当节点A在前序中出现在节点B之前,并且在后序中出现在节点B之后,节点A是节点B的祖先。

    基于此,对于任意两个节点,我们可以判断一个是否是另一个的祖先。

    使用它,我们首先放置根 R(预排序中的第一个节点)。然后我们放置根的第一个子节点 A1(前序中的第二个节点)。现在使用定理 1,我们可以确定哪些其他节点低于 A1。所有这些节点将出现在前序中的 A1 之后,以及后序中的 A1 之前。在其他节点(不低于 A1)中,第一个出现在预排序中的节点也是 R 的直接子节点。我们称其为 A2。我们可以再次找出哪些其他节点位于 A2 以下。然后放置A3。以此类推。

    通过这种方式,我们将树重建到第一级(A1、A2、A3、...An),并且我们知道哪些节点位于 A1 下方,哪些节点位于 A2 下方,依此类推.现在我们可以对每个 A1、A2 等递归地遵循上述过程,我们将拥有树!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-03
      • 2014-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多