从预订和后订单遍历构造(非二进制)树

时间:2014-02-21 00:15:24

标签: algorithm tree

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

我需要从预订单列表和订单后列表重建树。

示例 - 下面的第一行是预购,第二行是下订单。

QRUVSTWXZY 
UVRSWZXYTQ

树看起来像这样:

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

我对如何通过这两个列表并构建一棵树有一个模糊的想法,但我的逻辑仍然是撞墙。

任何人都可以建议一个可以通过两个列表找到结构的算法或方法吗?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

定理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等,我们将有树!