合并多个深度为1的树

时间:2015-05-19 21:50:15

标签: algorithm tree

我有多个子树,由根元素和多个子元素组成。子树的根可以是其他子项,子树的子项可以是其他根。

最后可能有多棵完全分开的树木。

示例:

root1
  |-child11
  |-root3

root2
  |-child21
  |-root1
  |-child23

root3
  |-child31

应该导致:

root2
  |-child21
  |
  |-root1
  |   |-child11
  |   |-root3
  |       |-child31
  |
  |-child23

有一个很好的算法来解决这个问题吗?我只找到了二叉树的解决方案。

2 个答案:

答案 0 :(得分:0)

您可以在每个节点中保留一个:

  • 儿童的哈希表(或链表+哈希表,如果顺序很重要)

  • 指向父级(或None

  • 的指针

此外,保持哈希表将节点ID映射到节点列表。

虽然后一个哈希表中有一个长度大于1的列表,但找到哪个树应该合并到哪个树中。

答案 1 :(得分:0)

将节点结构定义为具有父节点和子集。

保留一组所有唯一节点。

处理所有小树时,填充为每个父项设置的子项,并将每个子项指回其父项。 (一路上,在uniques上将每个新的看不见的节点添加到你的集合中。)

最后,如果是唯一的话,请走这个集合。没有父节点的任何节点都是重建树的根。