【发布时间】:2018-09-10 19:11:39
【问题描述】:
所以我想实现一个树的严格定义——一个没有任何循环的图。递归地,它是一个具有 n 个子树/子节点的节点。因此,每个节点都需要某种数据结构来将它与它的 n 个子树关联起来。
-
数组、列表、序列、有序集合:子级并没有真正的排序。有一种特殊类型的树称为“有序树”,它确实将某种排序与节点的子节点相关联,但这在这里似乎不合适。
例如:
Tree(3, Tree(4), Tree(5) ) == Tree(3, Tree(5), Tree(4) ) -
集合:集合没有顺序,但也不包含重复项。从功能上讲,如果 Tree(3) == Tree(3) 是有意义的,但我们需要重复信息,因为一个节点可以有多个 Tree(3) 作为子树。
例如:
Tree(3, Tree(4) ) != Tree(3, Tree(4), Tree(4) ) Bag:一个无序集合,允许添加项目,但不允许删除任何项目。这似乎与可以移除树上的孩子这一事实不一致。
还有其他更合适的无序数据结构吗?我确定这是以前的问题,常见的解决方案是什么?
谢谢!
【问题讨论】:
-
我不知道你到目前为止尝试了什么 - 一个无序的将通过硬编码节点之间的链接和它的孩子来完成。 - 就像一棵二叉树。如果你想要一个有序的树,那么你可以尝试 BST 或 Max/Min heap。你可以看看这个链接:stackoverflow.com/questions/49598967/…
-
硬编码似乎只有在你有像 BinTree 这样有固定数量的孩子而不是可变数量的孩子的情况下才真正起作用。我想一种方法可能只是表示整个事物,例如有顶点和节点的图。但这摆脱了保证无循环规则。我觉得这里可能有一个优雅的解决方案,比如哈希图,但这需要所有东西都定义一些哈希。
-
一个非常有用的数据结构是left-child, right-sibling binary tree。这使您可以非常简单地表示任何类型的树,每个节点具有任意数量的子节点。
-
我相信这将使相等比较变得困难,因为无论顺序如何,都需要检查兄弟姐妹的链接列表的内容。我觉得哈希表可能最适合以后进行相等比较。
标签: data-structures tree unordered