我有多个子树,由根元素和多个子元素组成。子树的根可以是其他子项,子树的子项可以是其他根。
最后可能有多棵完全分开的树木。
示例:
root1
|-child11
|-root3
root2
|-child21
|-root1
|-child23
root3
|-child31
应该导致:
root2
|-child21
|
|-root1
| |-child11
| |-root3
| |-child31
|
|-child23
有一个很好的算法来解决这个问题吗?我只找到了二叉树的解决方案。
答案 0 :(得分:0)
您可以在每个节点中保留一个:
儿童的哈希表(或链表+哈希表,如果顺序很重要)
指向父级(或None
)
此外,保持哈希表将节点ID映射到节点列表。
虽然后一个哈希表中有一个长度大于1的列表,但找到哪个树应该合并到哪个树中。
答案 1 :(得分:0)
将节点结构定义为具有父节点和子集。
保留一组所有唯一节点。
处理所有小树时,填充为每个父项设置的子项,并将每个子项指回其父项。 (一路上,在uniques上将每个新的看不见的节点添加到你的集合中。)
最后,如果是唯一的话,请走这个集合。没有父节点的任何节点都是重建树的根。