如何根据一组叶节点的路径片段来构建树

时间:2019-06-25 10:08:15

标签: javascript algorithm tree

当唯一的输入数据是叶节点的路径决策(以随机顺序)时,我正在寻找一种算法来构造可能的自上而下的树形结构。

如果叶子节点未通过该节点,则路径决策不附加[nodeID] +,如果叶子节点未通过该节点,则不附加[nodeID]-。输入示例:

enter image description here

上面示例输入中的一种可能的树结构是:

enter image description here

输出应该是节点列表,并且节点分别是父节点,如下所示:

enter image description here

如您所见,每个叶节点的可能位置不限于一个,因为输入数据不是完整的路径。示例中的Leaf1可以是节点D或节点I的子代。

您可以从任何数量的叶子中获取路径数据,但每个叶子只有一行数据。可能有叶子,您根本无法获得任何数据,并且您不知道树中有多少总叶子。路径数据中提到的所有节点都应该出现在输出表中,并且仅应为计算出的根分配任何父节点。

我想人们必须以某种方式组合来自每个Leaf路径的事实,例如从Leaf1您知道:A和E一定不能平行,而从Leaf2您知道A和我一定不能平行,所以在...

首选javascript,但也欢迎使用其他语言或伪代码!

1 个答案:

答案 0 :(得分:1)

由于没有人回答,我会提出一些想法。

您从开始:

1: [A+, E+, H-]
2: [B-, A+, I+, D-]
3: [K+, G+, E+, C-]
4: [H+, A-, G-]

首先,搜索仅以+出现的节点。扎根。进行扫描,我们可以对节点EIK进行此操作。因此,我们的答案始于:

E
E I
I K

我们的路径数据简化为:

1: [A+, H-]
2: [B-, A+, D-]
3: [G+, C-]
4: [H+, A-, G-]

现在我们有一个分区操作。为此,我们制作了一个图形,其中2个节点连接在一起(如果它们与+一起出现)。然后,我们通过连接的组件将节点分开,并将叶子划分为有+的分区(任何没有分区的叶子都可以在树中在那里成为叶子,然后丢弃)。删除任何内容-通过这种分离可以解决。在我们的例子中,这是一个完全断开的图,将每个节点放入其自己的分区中,并将路径数据分为3组(注意,我们丢失了所有-分区解释的规则):

1: [A+]
2: [A+]

3: [G+]

4: [H+]

现在我们解决了每个问题,最终解决了:

E
E I
I K
K A
K B
K C
K D
K G
K H

我相信这种方法只会在没有树的情况下无法取得进展。如果找到一棵树,它将找到一棵。