Рекурсия с лямбда-выражениями - PullRequest
0 голосов
/ 14 января 2020

У меня проблемы с пониманием лямбда-выражений. Мой фрагмент кода должен использовать позицию дерева и выполнять обход кода. Я думаю, что я могу смотреть на это неправильно. Может быть, logi c или отсутствие знания синтаксиса лямбда-выражений - вот что мешает мне делать то, что я хочу. Любая помощь будет принята с благодарностью. Ниже мой фрагмент кода:

@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));
    };
}

1 Ответ

1 голос
/ 14 января 2020

Начните с «применить посетителя к узлу и всем его подузлам», то есть:

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 (оба метода) будет выглядеть как Consumer<? super E> visitor. Это означает, что посетитель является функцией, которая принимает аргумент типа E или любой супертип типа E (например, Consumer<Object>, если E является Integer)

...