Таким образом, в основном вы выполняете поиск в глубину, а не отслеживаете явное посещение узлов неразрушающим способом или поддерживаете достаточно контекста для поиска без отслеживания, вы уничтожаете дерево для этого отслеживания.
Традиционный способ преобразовать это в простой DFS состоит в том, чтобы обойти ваше рекурсивное условие, в основном, изменить дочерний рекурсивный вызов на что-то вроде:
} else {
for (Node child = node.firstChild(); node != null; node = node.nextChild()) {
traverse(child);
}
}
Это будет проходить через всех ваших детей, и вы можете в значительной степени удалить случай node.isLeaf, поскольку возврат выполняется автоматически для вас. Обратите внимание, что я создал функцию nextChild
, поскольку не вижу, как она вызывается в вашем коде, но у вас должно быть что-то похожее или какой-то способ перебора дочерних элементов.
Альтернативным способом, который сохраняет большую часть структуры вашего существующего кода, будет сохранение отдельной структуры данных, которая содержит набор «посещенных» узлов, это может быть так же просто, как и набор строк, если все имена ваших узлов уникальный - вместо того, чтобы удалить узел, добавьте его в набор «посещенных», и в ваших условиях рекурсии не проверяйте на ноль, а скорее найдите первый не посещенный узел. Это, вероятно, более сложно, чем приведенное выше предложение, но может быть больше похоже на то, что у вас есть сейчас - и позволит избежать циклов в случае, если вам когда-либо понадобится сделать это на циклическом графе, а не на дереве.