我正试着理解黄花树的结构,并且遇到了一些困难!
首先我定义了一棵树:
val tree: Tree[Int] =
1.node(
2.leaf,
3.node(
4.leaf,
5.leaf))到目前为止,使用TreeLoc,我已经解决了如何找到与某些谓词匹配的第一个元素。例如,要查找值为3的第一个节点:
tree.loc.find(x => x.getLabel == 3)我的下一个挑战是尝试查找与某些谓词匹配的所有节点。例如,我想找到所有的叶节点(使用TreeLoc和isLeaf应该非常容易)。不幸的是,在我的一生中,我无法想出如何走这棵树来做到这一点。
编辑:对不起,我想我原来的问题还不够清楚。要清楚地说,我想以这样一种方式行走这棵树,这样我就可以得到关于节点的信息。扁平化、foldRight等只允许我在Int上操作,而我希望能够在Tree上操作。
发布于 2017-05-15 09:10:44
为了查看find是如何在scalaz中实现的,我的建议是实现如下内容:
implicit class FilterTreeLoc[A](treeLoc: TreeLoc[A]){
def filter(p: TreeLoc[A] => Boolean): Stream[TreeLoc[A]] =
Cobind[TreeLoc].cojoin(treeLoc).tree.flatten.filter(p)
}它的行为类似于find,但它给您的是一个Stream[TreeLoc[A]]而不是一个Option[TreeLoc[A]]。
您可以将其用作tree.loc.filter(_.isLeaf)和tree.loc.filter(_.getLabel == 3)。
注意:如果您希望将隐式类声明为方法,那么显然可以避免使用隐式类。
https://stackoverflow.com/questions/43885434
复制相似问题