我要使用的树由具有左子节点和右兄弟节点的节点组成。除了左子节点,兄弟节点不会连接到父节点。
我需要从预订单列表和订单后列表重建树。
示例 - 下面的第一行是预购,第二行是下订单。
QRUVSTWXZY
UVRSWZXYTQ
树看起来像这样:
Q
/ | \
R S T
/ \ / | \
U V W X Y
|
Z
我对如何通过这两个列表并构建一棵树有一个模糊的想法,但我的逻辑仍然是撞墙。
任何人都可以建议一个可以通过两个列表找到结构的算法或方法吗?
答案 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等,我们将有树!