繁体   English   中英

从前顺序和后顺序遍历构造一个(非二进制)树

[英]Construct a (non-binary) tree from pre-order and post-order traversal

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

我需要从预订列表和订购列表中重建树。

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

QRUVSTWXZY 
UVRSWZXYTQ

这棵树看起来像这样:

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

我对如何浏览这两个列表并构造一棵树有一个模糊的想法,但是我的逻辑是不断碰壁。

谁能提出可以遍历两个列表并找到结构的算法或方法?

您需要做的就是比较两个列表,我们使用一个简单的想法,即父节点始终按相反的顺序在子节点之前,在子节点之前。 如果预购中的第一个元素等于后购中的最后一个元素,则将其作为剩余列表的根节点(父节点)并将其从两个列表中删除。 Qruvstwxzy-> ruvstwxzy uvrswzxytQ-> uvrswzxyt步骤2现在比较两个列表(新),第一个位置的元素是先前删除节点的直接子元素,现在将字符串ass子字符串分开,直到后顺序列表中出现相同元素。 现在用迭代的方式来处理现在遗留的字符串。Ruvstwxzy-> Ruv S Twxzy uvRswzxyt-> uvR S wzxyT step3如果在此迭代中,我们得到的字符串只有一个元素,那么它是一个叶节点,而其直接子节点为父节点这整个字符串。

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

定理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等中的每一个进行递归地遵循上述过程,我们将获得树!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM