合并多棵深度为一的树
Merge multiple trees with a depth of one
我有多个子树,由一个根元素和多个 children 组成。子树的根可以是另一个 children,子树的 children 可以是另一个根。
最终可能会有多个完全分离的树。
示例:
root1
|-child11
|-root3
root2
|-child21
|-root1
|-child23
root3
|-child31
结果应为:
root2
|-child21
|
|-root1
| |-child11
| |-root3
| |-child31
|
|-child23
有什么好的算法可以解决吗?我只找到了二叉树的解决方案。
你可以在每个节点中保留一个:
散列table(或链表+散列table,如果顺序很重要)对于children
指向parent(或None
)的指针
此外,保留一个散列 table 将节点 ID 映射到节点列表。
虽然后面的hashtable中有一个长度大于1的列表,求哪棵树应该合并到哪棵树中。
将节点结构定义为具有一个父节点和一组子节点。
保留所有唯一节点的集合。
当您处理所有小树时,填充为每个父节点设置的子节点,并将每个子节点指向其父节点。 (一路上将每个新的看不见的节点添加到您的唯一集合中。)
最后遍历 if uniques 集合。任何没有父节点的节点都是重建树的根。
我有多个子树,由一个根元素和多个 children 组成。子树的根可以是另一个 children,子树的 children 可以是另一个根。
最终可能会有多个完全分离的树。
示例:
root1
|-child11
|-root3
root2
|-child21
|-root1
|-child23
root3
|-child31
结果应为:
root2
|-child21
|
|-root1
| |-child11
| |-root3
| |-child31
|
|-child23
有什么好的算法可以解决吗?我只找到了二叉树的解决方案。
你可以在每个节点中保留一个:
散列table(或链表+散列table,如果顺序很重要)对于children
指向parent(或
None
)的指针
此外,保留一个散列 table 将节点 ID 映射到节点列表。
虽然后面的hashtable中有一个长度大于1的列表,求哪棵树应该合并到哪棵树中。
将节点结构定义为具有一个父节点和一组子节点。
保留所有唯一节点的集合。
当您处理所有小树时,填充为每个父节点设置的子节点,并将每个子节点指向其父节点。 (一路上将每个新的看不见的节点添加到您的唯一集合中。)
最后遍历 if uniques 集合。任何没有父节点的节点都是重建树的根。