Рассчитайте самый длинный путь между двумя узлами.
Путь в арке.
Подпись метода:
public static int longestPath(Node n)
В приведенном ниже двоичном дереве это 4 (идет через 2-3-13-5-2).
Это то, что я имею прямо сейчас, и для данного дерева он просто возвращает 0.
public static int longestPath(Node n) {
if (n != null) {
longestPath(n, 0);
}
return 0;
}
private static int longestPath(Node n, int prevNodePath) {
if (n != null && n.getLeftSon() != null && n.getRightSon() != null) {
int currNodePath = countLeftNodes(n.getLeftSon()) + countRightNodes(n.getRightSon());
int leftLongestPath = countLeftNodes(n.getLeftSon().getLeftSon()) + countRightNodes(n.getLeftSon().getRightSon());
int rightLongestPath = countLeftNodes(n.getRightSon().getLeftSon()) + countRightNodes(n.getRightSon().getRightSon());
int longestPath = currNodePath > leftLongestPath ? currNodePath : leftLongestPath;
longestPath = longestPath > rightLongestPath ? longestPath : rightLongestPath;
longestPath(n.getLeftSon(), longestPath);
longestPath(n.getRightSon(), longestPath);
return longestPath > prevNodePath ? longestPath : prevNodePath;
}
return 0;
}
private static int countLeftNodes(Node n) {
if (n != null) {
return 1+ countLeftNodes(n.getLeftSon());
}
return 0;
}
private static int countRightNodes(Node n) {
if (n != null) {
return 1+ countRightNodes(n.getRightSon());
}
return 0;
}
Я понимаю, что у меня отсутствует ключевая концепция где-то... Мой мозг сходит с ума, когда я пытаюсь отслеживать поток исполнения...
Правильно ли я говорю, что, найдя самый длинный путь среди корня, его левый и правый узлы, а затем рекурсивно на его левом и правом узлах передавая им самый длинный путь из предыдущего вызова метода и, наконец, (когда?) Возвращает самый длинный путь, я "Не знаю, как вы собираетесь его вернуть...