scala - 如何递归解析这种树状结构?

标签 scala data-structures

考虑具有以下节点定义的树状数据结构 -

Node(id:Int, parent: Int, name:Option[String])

我有一个列表[Node],其中具有相同父节点的节点 n 可以具有相同的 id。我想创建一个新的 List[Node],以便每个 Node 都有一个唯一的 id。把每个节点的id和parent重写一下,形成输出列表就可以了。我不需要确切的代码,只需要一些提示来编写递归解决方案

示例 -

输入 - 列表(节点(5, 0, "a"), 节点(2, 5,"b"), 节点(2, 5, "c"), 节点(3,5, "d"), 节点(4, 3,"e"))

输出 - List(Node(1, 0, "a"), Node(2, 1, "b"), Node(3, 1, "c"), Node(4, 1, "d"), 节点(5, 4, "e"))

最佳答案

因此,在知道父节点的新 id 之前,我们无法对任何子节点重新编号。这不是一项简单的任务。

case class Node(id:Int, parent: Int, name:String)

def renum(in   :List[Node]
         ,seen :Map[Int,Int] = Map(0 -> 0)
         ,acc  :List[Node]   = Nil
         ,hold :List[Node]   = Nil) :List[Node] = in match {
  case Nil =>                                            //are we done?
    if (hold.isEmpty) acc.reverse else renum(hold, seen, acc)
  case Node(id,par,nm) :: ns if seen.isDefinedAt(par) => //parent was processed
    val newId = acc.size + 1
    renum(ns, seen+(id->newId), Node(newId,seen(par),nm)::acc, hold)
  case n :: ns =>                                        //put node on hold
    renum(ns, seen, acc, n::hold)
}

测试:

/*
     a 
   / | \
   b c d
       |
       e
*/
val input = List(Node(5,0,"a"),Node(2,5,"b"),Node(2,5,"c"), Node(3,5,"d"),Node(4,3,"e"))

renum(util.Random.shuffle(input))
renum(util.Random.shuffle(input))
renum(util.Random.shuffle(input))
renum(util.Random.shuffle(input))
renum(util.Random.shuffle(input))
//res0: List[Node] = List(Node(1,0,a), Node(2,1,c), Node(3,1,b), Node(4,1,d), Node(5,4,e))
//res1: List[Node] = List(Node(1,0,a), Node(2,1,b), Node(3,1,d), Node(4,1,c), Node(5,3,e))
//res2: List[Node] = List(Node(1,0,a), Node(2,1,b), Node(3,1,d), Node(4,3,e), Node(5,1,c))
//res3: List[Node] = List(Node(1,0,a), Node(2,1,b), Node(3,1,c), Node(4,1,d), Node(5,4,e))
//res4: List[Node] = List(Node(1,0,a), Node(2,1,b), Node(3,1,c), Node(4,1,d), Node(5,4,e))

关于scala - 如何递归解析这种树状结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56928943/

相关文章:

scala - 如何计算 SortedMap/TreeMap 的运行总计

scala - Play 2.0 和 SNAPSHOT 依赖项

java - IntelliJ 未正确创建/导入新的 Play Framework 项目

scala - 在 Scala 中使用 self 类型时如何保持单一责任?

algorithm - 树递归-打印给定数字的子序列

scala - Scala中的匿名子类

c - 如何选择哈希表的大小?

具有良好性能的c++ map实现

c++ - 二叉树数据存储实现

LINQ:字段不是引用字段