首页 > 解决方案 > 使用 lambda 表达式进行递归

问题描述

我在理解 lambda 表达式时遇到了一些麻烦。我的代码片段应该使用树的位置并使用代码进行遍历。我想我可能看错了方向。也许 lambda 表达式的逻辑或缺乏语法知识是阻止我做我想做的事的原因。任何帮助将不胜感激。在我的代码片段下面:

@Override
public void traverseInOrder(Consumer<Position<E>> visit) {
    visit = p -> inOrder(p);
    visit.accept(root);
}

private void inOrder(Position<E> p) throws InvalidPositionException {
    BinaryTreeNode<E> t = (BinaryTreeNode<E>) p;
    pt -> {
        inOrder(t.left);
        System.out.println(t.element());
        inOrder(t.right));
    };
}

标签: javaalgorithmbinary-tree

解决方案


从“将访问者应用于节点及其所有子节点”开始,即:

private void inOrder(Consumer<E> visitor, BinaryTreeNode<E> node) {
    if (node != null) {  // some stop condition
        // TODO traverse left subnode
        // TODO visit actual element
        // TODO traverse right subnode
    }
}

这被称为:

@Override
public void traverseInOrder(Consumer<E> visitor) {
    inOrder(visitor, root);
}

反过来,它可以被称为:

traverseInOrder(e -> System.out.println(e));
// or, same as above
traverseInOrder(System.out::println);

第一种方法应该很简单,例如:

private void inOrder(Consumer<E> visitor, BinaryTreeNode<E> node) {
    if (node != null) {
        inOrder(visitor, t.left);
        visitor.apply(t.element);
        inOrder(visitor, t.right);
    }
}

松散地基于发布的代码,假设类型,未经测试

注1:如果使用java.util.function.Consumer类,它应该是visitor.accept(t.element)

注意2:正如Clashsoft评论的那样,声明visitor(两种方法)的正确方法是 as Consumer<? super E> visitor。这意味着访问者是一个函数,它接受类型E或任何超类型的参数E(如Consumer<Object>ifE是 an Integer


推荐阅读