我得到了二叉树的以下定义
abstract class Tree[+A]
case class Leaf[A](value: A) extends Tree[A]
case class Node[A](value: A, left: Tree[A], right: Tree[A]) extends Tree[A]
Run Code Online (Sandbox Code Playgroud)
以及以下功能
def fold_tree[A,B](f1: A => B)(f2: (A, B, B) => B)(t: Tree[A]): B = t match {
case Leaf(value) => f1(value)
case Node(value, l, r) => f2(value, fold_tree(f1)(f2)(l), fold_tree(f1)(f2)(r)) //post order
}
Run Code Online (Sandbox Code Playgroud)
我被要求使用fold方法返回树中最右边的值.这怎么样?我不确定我是否完全理解折叠,但我认为折叠的重点是对树中的每个元素进行一些操作.如何使用它只返回树的最右边的值?
我也不确定如何调用该方法.我一直遇到未指定参数类型的问题.有人能告诉我调用这个fold_tree方法的正确方法吗?
这将如何运作?我不确定我是否完全了解折叠
您的foldTree
方法正在做的是递归地遍历树,将其自身应用到遇到的每个树Node
或Leaf
遇到的树中。该方法还具有需要被应用了两个类型的参数,A
以及B
,根据所提供的树的类型。
为了便于说明,我们有一个Tree[Int]
这样的定义:
val n = Node(1, Leaf(2), Node(3, Leaf(5), Node(4, Leaf(42), Leaf(50))))
Run Code Online (Sandbox Code Playgroud)
该树的结构如下所示:
我们想要获得最正确的值,即50。为了使用的当前实现做到这一点foldTree
,我们需要提供两种方法:
f1: A => B
:给定A
,项目B
值f2: (A, B, B) => B
:给定一个A
和两个B
值,投影一个B
。我们可以看到将f1
应用于Leaf
,并将f2
应用于Node
(因此,每种方法提供的元素数量不同)。因此,这给了我们一个提示,即我们提供的功能foldTree
将分别应用于每个功能。
鉴于我们的树,我们已经有了丰富的知识:
val n = Node(1, Leaf(2), Node(3, Leaf(55), Node(4, Leaf(42), Leaf(50))))
Run Code Online (Sandbox Code Playgroud)
我们提供以下方法:
println(foldTree[Int, Int](identity)((x, y, z) => z)(n))
Run Code Online (Sandbox Code Playgroud)
这意味着如下:
Leaf
节点并在其f1
上映射(通过应用),我们只想提取它的值。Node
元素(并应用f2
到它)时,我们要采用最右边的元素,该元素由z
我们方法中的第三个元素投影。运行此命令可获得预期结果:50
。
如果我们想将其通用扩展为任何A
,我们可以说:
def extractRightmostValue[A](tree: Tree[A]) =
foldTree[A, A](identity)((x, y, z) => z)(tree)
Run Code Online (Sandbox Code Playgroud)