Tworzenie drzewa na podstawie odpowiedzi z API

0

Całkowicie się zablokowałem przy dość trywialnym problemie.
Mam API które zwraca liste elementów na danym poziomie drzewa, czyli pojedynczy response to lista takich obiektów

public class ElementDto {
    private String id;
    private String name;
    private boolean leaf;
}

Jeżeli leaf == true to znaczy, że pod spodem nie ma więcej poziomów drzewa, jeżeli jednak leaf == false to znaczy, że dany element ma kilkoro dzieci, innymi słowy, mogę wziać jego id i wykonać GET/api/elements/{id} i dostanę kolejną listę elementów.

Problem w tym, że chciałbym od danego miejsca pobrać wszystko co pod spodem, czyli odtworzyć całe takie drzewo u siebie w aplikacji.

Stworzyłem więc prostą klasę, która reprezentuje pojedynczy element tego drzewa

public class TreeNode {
    private final TreeNode parent;
    private final String id;
    private final String name;
    private final List<TreeNode> children;

    public static TreeNode root(String id, String name) {
        return new TreeNode(null, id, name, new ArrayList<>());
    }

    public static TreeNode leaf(TreeNode parent, String id, String name) {
        return new TreeNode(parent, id, name, new ArrayList<>());
    }

    public void addChildren(TreeNode node) {
        this.children.add(node);
    }
}

No i zacząłem pisać...

    public void buildTree() {
        final TreeNode root = buildTreeRoot();
        addChildrenNodes(root);
        root.getChildren()
                .stream()
                .map(TreeNode::getChildren)
                .flatMap(Collection::stream)
                .forEach(this::addChildrenNodes);
    }

    private TreeNode buildTreeRoot() {
        final TreeNode root = TreeNode.root(ROOT_ID, ROOT_NAME);
        final List<ElementDto> elements = client.callApi(ROOT_ID);
        elements.forEach(element -> addChildrenNode(root, element));
        return root;
    }

    private void addChildrenNodes(final TreeNode parent) {
       parent.getChildren().forEach(child -> {
           final List<ElementDto> elements = client.callApi(child.getId());
           elements.forEach(element -> addChildrenNode(child, element));
       });
    }

    private void addChildrenNode(final TreeNode parent, final ElementDto element) {
        parent.addChildren(TreeNode.leaf(parent, element.getId(), element.getName()));
    }

Tyle, że ja nie wiem ile poziomów tego drzewa tam faktycznie będzie, musze decydować na podstawie odpowiedzi z API czy już pobrałem całośc drzewa (czyli mam elementy z leaf == true) i mogę przestać, czy jednak muszę iść głębiej. Problem w tym, że nie mam pojęcia jak to ugryźć, rekurencja, do{ ... } while()? Jakie warunki postawić i jak decydować w którym miejscu aktualnie jestem? Jakiekolwiek wskazówki mile widziane, bo zwyczajnie mam blokadę :/

1

Jak hint podam, że wystarczy wywalić tylko co 30% linijek i będzie działać.

0

DFS/BFS i jedzesz kolejno ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1