scala:多根树或森林的数据结构

时间:2016-01-25 14:12:16

标签: scala graph tree

我正在为我的要求寻找一个好的数据结构:

  • 支持多个根。
  • 应该有父母和子女的链接。

假设每个Node都可以唯一标识,我想出了一个看似有点不成熟的数据结构。

case class Node[T](data: T, children: List[Node[T]], parents: List[Node[T]])

class Forest[T](val roots: List[Node[T]]) {

  // other helper methods to create the Forest
}

object Forest {
  def apply[T](list: List[T]): Forest[T] = {
    val roots = for (l <- list) yield Node[T](l, List.empty[Node[T]], List.empty[Node[T]])
    new Forest[T](roots)
  }
}

有没有人有更好的建议?

TIA

1 个答案:

答案 0 :(得分:1)

我建议您查看Graph for Scala。该库未经过积极开发,但基本功能并不需要它,一旦您习惯了它遍历节点的方式,您就可以轻松获得许多功能。 (可能需要花一点时间考虑最好地将父/子关系放入图中;你可以制作一个有向图来表示那个,或者每个方向上有两个图,等等。)

否则,您现在拥有的基础知识缺少一个细节 - 您如何实际创建森林?现在,一个节点是不可变的,包含父和子的不可变列表,这意味着必须在节点之前创建每个节点的父节点和子节点,这意味着......呃 - 哦。

您可以通过添加额外的间接层(具有节点ID列表和将ID与实际节点相关联的映射)或通过在某处添加可变性来解决此问题(在案例类中通常有点不确定,但在这种情况下可能是它的你需要什么。)

然后,当然,你需要一堆方法来实际对森林做一些有用的事情,并提供更高层次的构建方法。