Создание дерева сумм двоичного дерева scala

В качестве домашнего задания я написал некоторый код 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, которая создает новое дерево, в котором узлы имеют значения, равные t o сумма значений его дочерних элементов плюс его собственное значение.

Я нахожу это довольно уродливым, и мне интересно, есть ли лучший способ сделать это. Если бы я использовал рекурсию, которая работает сверху вниз, это было бы проще, но я не смог придумать такую ​​функцию.

Мне нужно реализовать функцию foldс подписью, как в коде, для вычисления sumTree

У меня такое чувство, что это можно реализовать лучше, может быть, у вас есть предложения?

12
задан Bill the Lizard 18 September 2012 в 14:09
поделиться