【问题标题】:How to build a tree from a set of path fragments for leaf nodes如何从叶节点的一组路径片段构建树
【发布时间】:2019-11-07 03:31:52
【问题描述】:

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

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

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

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

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

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

我想必须以某种方式结合每个叶路径的事实,例如从 Leaf1 你知道:A 和 E 不能在平行线上,从 Leaf2 你知道 A 和 I 不能在平行线,所以上...

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

【问题讨论】:

  • 每个叶子最多有一个输入行,还是可以有多个输入行对应同一个叶子?
  • @tucuxi 是的,每片叶子最多一行。
  • 在您的示例中,您没有显示任何叶节点,并且至少需要有 5 个。但是您有 4 的数据。您的数据应该是针对某些叶节点还是全部?
  • @btilly 可以使用来自 4 个叶节点的分段路径信息构建许多不同的可能树。我只展示了一种可能的“解决方案”。叶子应该位于末端节点下方,在这个例子中只有 4 个,而不是 5 个。我需要一个算法来构建一个所有叶子路径都有效的树结构。在示例中只有 4 条路径。输入表和导出表是唯一重要的东西(树只用于可视化。)
  • 多于 4 个叶子,但只有来自 4 个叶子的路径数据。

标签: javascript algorithm tree


【解决方案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

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

【讨论】:

  • 非常有趣的解决方案似乎有效!太好了,谢谢!
猜你喜欢
  • 1970-01-01
  • 2011-07-12
  • 1970-01-01
  • 2020-10-10
  • 2021-09-19
  • 1970-01-01
  • 2018-04-04
  • 2012-04-08
  • 1970-01-01
相关资源
最近更新 更多