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

Scalaz树-从TreeLoc集合中查找最小/最大深度,scala,tree,stream,scalaz,Scala,Tree,Stream,Scalaz,在Scalaz中,我有一个树[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'

在Scalaz中,我有一个
树[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返回一个
。在此调用
.length
可以计算出深度,可以在左侧折叠中进行比较,但感觉很笨拙


<>我怎样才能做到这一点?

< P>我能用尾递归函数来计数父母,不确定你是否会或多或少地考虑“笨拙”:


为什么“E”是“最浅”的位置,而不是“B”呢?它是输入集中最浅的位置,只是E&d。如果说整棵树,那么是的,它是b。。。。还有c和e
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