#java #tree #depth-first-search
#java #дерево #поиск в глубину
Вопрос:
У меня есть это дерево:
Harry(root)
Jane
Joe
Diane
George
Jill
Carol
Mary
Mark
Bill
Grace
Я расширил код на этой странице
с помощью этой функции, которая использует поиск в глубину.
public static int path(Tree t, String root, String n)
{
// Default traversal strategy is 'depth-first'
int counter = 0;
Iterator<Node> depthIterator = t.iterator(root);
while (depthIterator.hasNext()) {
Node node = depthIterator.next();
if(node.getIdentifier().compareTo(n)==0)
{
System.out.println("Distance from " root " to " n " " counter);
return counter;
}
counter ;
System.out.println(node.getIdentifier());
}
return 0;
}
Моя конечная цель — найти длину пути между корнем и заданным узлом. Когда я запускаю эту функцию, расстояние от root и Joe, и, расстояние от root и Diane (которые являются братьями и сестрами) отличается, потому что оно подсчитывает шаги поиска в глубину.
Этот подход неправильный или есть способ это исправить?
Комментарии:
1. Важно ли для вас использовать итератор поиска в глубину? Я думаю, что итератор может быть проблематичным, потому что он переходит в дерево (вы могли бы, например, находиться на глубине 5, а следующий узел является дочерним элементом корня (глубина 1)). Я думаю, что написать свой собственный поиск в глубину, включая счетчик глубины, было бы проще, чем использовать существующий итератор.
2. Если вы знаете узел, не могли бы вы поместить его в стек, затем перейти к его родительскому элементу и помещать в стек, пока не окажетесь в корне, после чего извлеките весь стек и получите нужный путь?
3. @VenomFangs Похоже, что у класса Node нет родительского элемента (узлы не знают своего родителя). Они знают только своих дочерних элементов.
4. Как насчет функции, которая возвращает глубину узла даже без использования поиска в глубину?
5. @user840718, когда вы добавляете узлы, если у вас есть ссылка на родительский узел, вы можете извлечь его глубину и добавить к нему единицу. Если вы будете делать это для каждого добавления, то у вас будет нужная глубина, когда вам понадобится.
Ответ №1:
Ваше использование counter для определения глубины неверно. В коде, который вы показали, вы подсчитываете только элементы в итераторе.
Вам нужно заставить ваш метод path() вызываться рекурсивно и передать значение глубины в качестве параметра для метода. И увеличивайте значение глубины для каждого рекурсивного вызова.