【问题标题】:Scalaz Tree - finding the min/max depth from a TreeLoc setScalaz Tree - 从 TreeLoc 集中找到最小/最大深度
【发布时间】:2015-04-19 11:04:11
【问题描述】:

在 Scalaz 中,我有一个 Tree[A] 之类的;

'A'.node('B'.leaf, 'C'.node('D'.leaf), 'E'.leaf)

现在假设我有一个通过树递归并返回 TreeLoc 的函数;

def getCharLoc(c: Char) = tree.loc.find(_.getLabel == c)

然后我做类似的事情

Seq('D','E').flatMap(getCharLoc)

如何在树中找到最低和/或最高的loc。在上面的示例中,'D' 是最低/最深的位置,'E' 是最高/最浅的位置。

我在想每个loc 都有一个.path 方法,该方法将Stream 从本地返回到根。对此调用.length 将计算深度,可以在左侧折叠中进行比较,但感觉很笨重。

我怎样才能做到这一点?

【问题讨论】:

  • 为什么'E'是'最浅'的位置,而不是'B'?
  • 这是输入集中最浅的一个,只是 e & d。如果谈论整棵树,那么是的,它是 b.... 以及 c 和 e

标签: scala tree stream scalaz


【解决方案1】:

我能够用尾递归函数计算父母,但不确定您是否会认为这或多或少“笨拙”:

val tree = 'A'.node('B'.leaf, 'C'.node('D'.leaf), 'E'.leaf)

@tailrec def countParents(loc: Option[TreeLoc[Char]], acc: Int = 0): Int = 
  loc >>= { _.parent } match {
    case None => acc
    case next @ _ => countParents(next, acc + 1)
  }

println(countParents(tree.loc.find(_.getLabel == 'D'))) // 2
println(countParents(tree.loc.find(_.getLabel == 'E'))) // 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    • 1970-01-01
    • 1970-01-01
    • 2012-02-26
    相关资源
    最近更新 更多