(Java)使用功能(类似于谓词)的接口,该接口从二叉树中输出布尔值

时间:2019-01-19 19:57:44

标签: java recursion interface functional-programming binary-tree

我有点麻烦: 我构建了一个Binary Tree类,其中包含一些对于此任务而言并不有趣的功能。每个节点都存储一个左,右子级以及一个父级。每个节点都有一个键值,可以将其视为标签。 我创建了3个课程:

Tree.java是节点的类。

BinaryTree.java包含一些与整个树相关的方法,例如最小/最大值。

Main.java,它测试Tree的功能并包含main方法。

我的问题: 我想用一个方法来编写一个功能接口,该方法以节点作为参数并输出布尔值。这可用于传递“根”节点,并递归检查树中的每个节点是否大于或小于某个值。但是,我对功能接口完全陌生,我无法真正掌握功能背后的逻辑。这是我到目前为止所得到的:

@FunctionalInterface

public interface NodeOperation {
    public abstract boolean forAll(Tree node);
}

NodeOperation overTwenty = (node) -> node.getValue() < 20;

当我尝试使用lambda表示法时,当我要打印overTwenty时,它不会返回布尔值。有人可以帮助我实现功能性接口并向我解释如何访问布尔变量,以便我可以开始思考如何为每个节点递归执行此操作。

如果您对二叉树不太了解,建议您在Wikipedia上查找。以我为例,我制作了一个BST(二进制搜索树),这意味着其结构是基于较大的值在右侧,较小的值在左侧。如果您需要我的代码的某些特定部分,只需提出建议,然后将其张贴在这里:)

2 个答案:

答案 0 :(得分:1)

在Java中,接口的方法始终是公共的。这样您的界面就可以成为

@FuctionalInterface
    public interface NodeOperation {
        boolean forAll(Tree node);
    }

所以您已经编写了这一行代码

NodeOperation overTwenty = (node) -> node.getValue() < 20;

将为您创建一个接口实例,以检查节点的值是否小于20

因此,假设您有一个值为30的Tree节点实例。 如果您致电

 overTwenty.forAll(node) //will return false

此函数不是递归的。如果要将功能应用于节点的所有子节点,则必须在Tree类上编写一个递归方法

   public class Tree{
       ... 
    public boolean recursiveNodeOperation(NodeOperation operation) {
       if(!operation.forAll(this)) return false;
       for(Tree child : children) 
            if(! child.recursiveNodeOperation(operation)) 
                return false
       return true ;

      } 
    } 



root.recursiveNodeOperation(overTwenty); //will return true if all the nodes of the Tree starting from root are lower than 20

此方法将递归应用Node操作,因此将检查Tree中的所有元素是否与您的函数匹配

答案 1 :(得分:0)

您创建的overTwenty对象是一个函数。如果要在树的节点中使用它,则必须在树的节点上调用它的唯一方法。例如,您可以这样称呼它:

boolean result = overTwenty.forAll(root);

顺便说一下,您的NodeOperation接口与Function<Tree, Boolean>相当,区别是它返回的是原始boolean而不是类Boolean