Scalaz Tree - 从TreeLoc集中查找最小/最大深度

时间:2015-02-18 12:30:30

标签: scala tree stream scalaz

在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方法,它会从loc返回Stream到根。在此基础上调用.length可以计算出可以在左侧折叠中进行比较的深度,但感觉很笨重。

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分: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