scala - 斯卡拉 | 在二叉树中折叠
问题描述
fold
我在我的 scala 代码中
实现了一个方法。我可以用它来确定树的size
和depth
。
现在我想实现这些方法max
,map
它们应该像这里一样工作。
不同之处在于,该值保存在分支而不是叶子中。
到目前为止,这是我的代码:
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
ie 是“静态的”)。
其次,从实施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
}
看看它是如何为叶子中的值的树实现的。
然后用使用的那个替换这个实现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
, l
,r
它们是递归调用的结果。???_1_
正是如此???_1
。
推荐阅读
- angular - 如何将有效负载转换为 formData
- ios - 为 iOS [Swift、iOS 15] 编写 PDF 查看器时无法激活三次轻击手势
- algorithm - 使用遗传算法的自动时间表调度器?
- angular - 无法绑定选中的复选框以进行更新
- docker - MariaDB Docker 容器 - 权限被拒绝 - 没有对目录的访问权限
- java - 在这种情况下如何定义按钮的xpath(硒)
- reactjs - 反应确认警报被引导模式阻止
- node.js - AzureKeyCredential for Search via identity.DefaultAzureCredential
- flutter - GetIt 无法根据抽象类/接口正确找到注册类型,但使用具体类成功
- java - c#中sql-connection类上单例模式的实现