Я пишу функцию, которая поможет мне вычислить самый длинный подпуть древовидной структуры данных.То, что я написал до сих пор, использует рекурсивный метод, чтобы «копаться» в каждой подотрасли - в основном поиск в глубину.У меня нет большого контроля над tree
, который является просто Map
, где каждый ключ - это узел, а значение для каждого ключа - это список узлов, на которые указывает ключ.
Например, карта tree
может иметь:
"start" => ["1"]
"1" => ["2"]
"2" => ["3", "4"]
"3" => ["5"]
"4" => ["end"]
"5" => ["end"]
Я считаю, что код, который я написал ниже, решает мою проблему, заполняя список subLengths
длинами всех подпутей вдерево.Все, что мне нужно сделать, это уменьшить subLengths
, чтобы получить максимальную длину.
private void calculateAllSubPathLengths(String start, Map<String, List<String>> tree, int pathLength, List<Integer> subLengths){
pathLength++;
for(String connectedNode: tree.get(start)) {
if(connectedNode.equals("end")) {
subLengths.add(pathLength);
return;
}
calculateAllSubPathLengths(connectedNode, tree, pathLength, subLengths);
}
}
Я называю эту функцию следующим образом:
int pathLength = 0;
List<Integer> subLengths = new ArrayList<>();
calculateAllSubPathLengths("start", tree, pathLength, subLengths);
// Get max from the subLengths list and move on with the rest of my logic
Я не имею большого контроля над данными внутри карты tree
, и у нее нет традиционного дерева, такого каксвойства, как у бинарного дерева.Узлы в дереве могут иметь много ветвей, и оно может быть вложенным на много уровней глубиной.Но это очень маловероятно, учитывая мою проблемную область.Однако я хотел бы убедиться, что мой код может обрабатывать более сложные деревья, если они станут более вероятными в будущем.
Я задаю этот вопрос, потому что мой инстинкт инстинкта заключается в том, что я делаю это неправильно.Мои вопросы:
- Есть ли способ избежать использования списка
subLengths
? - Есть ли способ превратить эту рекурсивную функцию в интерактивную?Если нет, я, вероятно, добавлю какое-то условие, которое останавливает функцию, как только мы достигнем определенной «глубины».
- Существуют ли какие-либо другие "лучшие практики" рекурсии, которые я нарушаю?