2015-02-18 2 views
1

В Scalaz У меня есть Tree[A] like;Scalaz Tree - поиск глубины min/max из набора TreeLoc

'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 от loc к корню. Вызов .length на этом дал бы подсчет глубины, которую можно было бы сравнить в фокусе слева, но он чувствует себя неуклюжим.

Как я могу это достичь?

+0

Почему именно «Е» тем «неглубоким» место, а не «B», например? – LuGo

+0

Это самый мелкий из набора входных данных, который был всего лишь e & d. Если говорить обо всем дереве, то да, это b .... Наряду с c и e – NightWolf

ответ

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 
Смежные вопросы