斯卡拉 |在二叉树中折叠

Scala | Folding in binary tree


我在我的 scala 代码中实现了一个 fold 方法。我可以用它来确定树的sizedepth
现在我想实现 maxmap 方法,它们应该像 here.
一样工作 不同的是,值保存在分支而不是叶子。
到目前为止,这是我的代码:

sealed trait Tree[+A] {
  def size(): Int = fold(this)(() => 1)((l, r, v) => 1 + l + r)

  def depth(): Int = fold(this)(() => 0)((left: Int, right: Int, v: A) => 1 + (left max right))

  def fold[X, B](t: Tree[X])(f: () => B)(g: (B, B, X) => B): B = t match {
    case Leaf() => f()
    case Branch(left, right, v) => g(fold(left)(f)(g), fold(right)(f)(g), v)
  }
}

case class Leaf[A]() extends Tree[A]

case class Branch[A](left: Tree[A], right: Tree[A], v: A) extends Tree[A]

有人可以帮我吗?

首先,您可以将 fold 放入 Tree 的伴随对象(因为 fold 不使用 this 即 "static")。

其次,开始为您的案例实施map

def map[A,B](t: Tree[A])(f: A => B): Tree[B] = t match {
  case Leaf() => ???_1
  case Branch(l, r, v) => ???_2 // here l, r are Tree[A]'s i.e. subtrees of t
}

查看在叶子中具有值的树的 implemented 情况。

然后将此实现替换为使用 fold

的实现
def map[B](f: A => B): Tree[B] = 
  fold[A, Tree[B]](this)(() => ???_1_)((l: Tree[B], r: Tree[B], v: A) => ???_2_))
  // here l, r are Tree[B]'s i.e. results of map for subtrees

???_1_???_2_???_1???_2,其中您将 map 的递归调用替换为 lr,这是递归调用的结果。所以 ???_1_ 正好是 ???_1.