繁体   English   中英

如何从叶节点的一组路径片段构建一棵树

[英]How to build a tree from a set of path fragments for leaf nodes

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

如果叶节点已通过该节点,则路径决策用 [nodeID]+ 标记,如果叶节点未通过该节点,则用 [nodeID]- 标记。 示例输入:

在此处输入图片说明

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

在此处输入图片说明

输出应该是节点列表和节点各自的父节点,如下所示:

在此处输入图片说明

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

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

我想人们必须以某种方式结合来自每个叶子路径的事实,例如从您知道的 Leaf1 中:A 和 E 不能在平行线上,从 Leaf2 中您知道 A 和 I 不能在平行线上,依此类推.. .

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

既然没有人回答,我就说一些片面的想法。

你开始:

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

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

暂无
暂无

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

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