Для домашнего задания я написал код scala, в котором у меня есть следующие классы и объект (используемые для моделирования двоичного дерева):
object Tree {
def fold[B](t: Tree, e: B, n: (Int, B, B) => B): B = t match {
case Node(value, l, r) => n(value,fold(l,e,n),fold(r,e,n))
case _ => e
}
def sumTree(t: Tree): Tree =
fold(t, Nil(), (a, b: Tree, c: Tree) => {
val left = b match {
case Node(value, _, _) => value
case _ => 0
}
val right = c match {
case Node(value, _, _) => value
case _ => 0
}
Node(a+left+right,b,c)
})
}
abstract case class Tree
case class Node(value: Int, left: Tree, right: Tree) extends Tree
case class Nil extends Tree
Мой вопрос о функции sumTree
, которая создает новое дерево, где узлы имеют значения, равные сумме значений его дочерних элементов, плюс его собственное значение.
Я считаю это довольно уродливым, и мне интересно, есть ли лучший способ сделать это. Если я использую рекурсию, которая работает сверху вниз, это было бы проще, но я не мог придумать такую функцию.
Мне нужно реализовать функцию fold
с сигнатурой, как в коде, для вычисления sumTree
У меня появилось ощущение, что это может быть реализовано лучше, возможно, у вас есть предложения?