Вы можете сделать это рекурсивно или с помощью итераций, решать только вам.
Я считаю, что рекурсивное решение немного легче читать.Это выглядело бы так:
static Collection<ITreeNode<IProduct>> getOnLevel(
ITree<IProduct> tree
, int desiredLevel
) {
List<ITreeNode<IProduct>> result = new ArrayList<>();
findOneLevel(tree.getRoot(), desiredLevel, 0, result);
return result;
}
static void findOnLevel(
ITreeNode<IProduct> node
, int desiredLevel
, int currentLevel
, List<ITreeNode<IProduct>> result
) {
if (currentLevel == desiredLevel) {
result.add(node);
return;
}
Iterator<ITreeNode<IProduct>> iterator = node.getChildren().iterator();
while(iterator.hasNext()) {
getOneLevel(iterator.next(), desiredLevel, currentLevel+1, result);
}
}
Подход очень прост: метод верхнего уровня создает список для сохранения результата и вызывает рекурсивный findOnLevel
.Рекурсивный метод проверяет, достигли ли мы желаемого уровня, и добавляет текущий узел к результату, если мы это сделали.В противном случае мы пропускаем все дочерние элементы текущего узла в рекурсивном вызове, передавая currentLevel+1
для нового текущего уровня.