Отображение всего пути каждого листа на дереве

1

Я написал себе быстрый класс "Дерево" и "Узел" (ничего необычного, не нужно делать много). У меня есть переменное число узлов следующего уровня, я использую ArrayList для них. Он работает так, как предполагается, единственной проблемой является метод toString(). Пример: я установил его с кучей чисел.

  • 0 - корень
  • 0 имеет детей 1,2,3
  • 2 имеет детей 2,4 и 2,5

Теперь, когда я печатаю дерево, это то, что я получаю: (там должны быть косые черты)

  • /0/1
  • /2/2.5
  • /2.4
  • /3

Однако я хочу:

  • /0/1
  • /0/2/2.5
  • /0/2/2.4
  • /0/3

это мой toString():

public String toString() {
    String all = "";
    for (Node<T> node : nextNodes) {
        all += node.toString();
        if (node.isLeaf()) {
            all += "\n";
        }
    }
    return "/" + this.getNodeContent().toString() + all;
}

Может кто-нибудь, пожалуйста, скажите мне, что я должен изменить, чтобы каждый раз ходить от корня? Благодарю!

Теги:
path
tree
nodes

2 ответа

1
Лучший ответ

Сколько путей в три? Есть так много путей, сколько листьев - потому что ваш код не работает. Код, который вы написали, только итерации через все узлы. Но вы хотите напечатать все пути от корня до листьев.

Одним из решений является использование рекурсии: она начинается с корня и пути печати для каждого ребенка. Он выглядит примерно так

public void printPaths(Node<T> nodeOnPath, String onPath){
    String nodePath = onPath + "/" + nodeOnPath.getNodeContent().toString(); 
    if (nodeOnPath.isLeaf()){
        System.out.println(nodePath);
        return; 
    }

    ArrayList<Node> children = nodeOnPath.getChildren(); 
    for (Node<T> node : children){
        printPaths(node, nodePath); 
    }
}

Метод для печати путей Я называл printPaths - он принимает два аргумента: firs - node nodeOnPath, а второй - путь от корня к узлу nodeOnPath. В первой строке метода он создает nodePath. Затем проверьте, является ли узел листом - если ответ да, то напечатайте nodePath и выйдите из метода.

В случае, если узел не является листом, вы получите все дочерние элементы для узла, итерации через них и для каждого пути генерации узла. Эта часть для каждого цикла.

Чтобы распечатать все пути, вы вызовете метод printPaths следующим образом:

printPaths(rootNode, "");
1

Вам нужно добавить getNodeContent() для каждого пути childs, вот решение:

   public String toString() {
        String all = ""
        for (Node<T> node : nextNodes) {
            all += this.getNodeContent().toString() + node.toString();
            if (node.isLeaf()) {
                all += "\n";
            }
        }
        return "/" +  + all;
    }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню